gpt4 book ai didi

PHP类扩展

转载 作者:可可西里 更新时间:2023-11-01 00:22:39 24 4
gpt4 key购买 nike

我对类扩展的工作原理有疑问..

我正在尝试扩展一个类以将函数拆分到不同的文件中以使其更有条理..

但是我在将主类的变量和函数访问到子类时遇到问题。

这就是我所拥有的:

父类:uFlex Class v 0.88不写了,因为太长了..

class uFlex {
//Constants
const version = 0.88;
const salt = "";
//End of constants\\\\
/**
* PDO / database credentials
*/
var $db = array(
"host" => '',
"user" => '',
"pass" => '',
"name" => '', //Database name
"dsn" => '' //Alterntive PDO DSN string
);

function connect(){
if(is_object($this->db)) return true;

/* Connect to an ODBC database using driver invocation */
$user = $this->db['user'];
$pass = $this->db['pass'];
$host = $this->db['host'];
$name = $this->db['name'];
$dsn = $this->db['dsn'];

if(!$dsn){
$dsn = "mysql:dbname={$name};host={$host}";
}

$this->report("Connecting to database...");

try{
$this->db = new PDO($dsn, $user, $pass);
$this->report("Connected to database.");
}catch(PDOException $e){
$this->error("Failed to connect to database, [SQLSTATE] " . $e->getCode());
}

if(is_object($this->db)) return true;
return false;
}
}

然后:

<?php
class admin extends uFlex {

function adm_getUsers(){
if(!$this->connect()) return false;

$sql= "SELECT * from users LIMIT 30";
$st = $this->db->prepare($sql);
$out = $st->execute();
$row = $st->fetchAll(PDO::FETCH_ASSOC);
return $row;
}

function adm_getSingleUser($id){
if(!$this->connect()) return false;
if(is_numeric($id)){
$sql= "SELECT * from users WHERE id = '$id'";
}else{
$sql= "SELECT * from users WHERE username = '$id'";
}
$st = $this->db->prepare($sql);
$out = $st->execute();
$row = $st->fetch(PDO::FETCH_ASSOC);
return $row;
}
}

?>

我在每个页面中包含的配置文件中初始化它们:

$user = new uFlex(false);
$admin = new admin();

但是当使用 $admin->adm_getUsers(); $row 数组时它是空的。

在尝试将函数拆分为两个类之前,我在主类上使用了相同的函数,并且一直有效。

这是我第一次尝试扩展类(class)..我在谷歌上搜索,也在这里阅读了一些问题,但它对我来说太复杂了,因为我还在学习 PHP。

最佳答案

这就是继承并不是真正最佳答案的地方。相反,您可以放弃继承并改用组合。将您的 uFlex 实例作为 Admin 的依赖项传递,如下所示:

$user = new uFlex(false);
$admin = new Admin($user); // uFlex is being passed in

您首先需要更新您的 PHP 类,因为有一些更改:

class Admin {

// Added private variable that will hold the uFlex instance
private $user;

// Added a class constructor which will be called when we create a new Admin
function __construct($user) { // Receives an instance of uFlex
$this->user = $user;
}

function adm_getUsers(){
if(!$this->user->connect()) return false; // Call connect on user
$sql= "SELECT * from users LIMIT 30";
$st = $this->user->db->prepare($sql); // Call prepare on db of user
$out = $st->execute();
$row = $st->fetchAll(PDO::FETCH_ASSOC);
return $row;
}

function adm_getSingleUser($id){
if(!$this->user->connect()) return false; // Same here
if(is_numeric($id)) {
$sql= "SELECT * from users WHERE id = '$id'";
} else {
$sql= "SELECT * from users WHERE username = '$id'";
}
$st = $this->user->db->prepare($sql); // And here
$out = $st->execute();
$row = $st->fetch(PDO::FETCH_ASSOC);
return $row;
}
}

关于PHP类扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com