5

本质上,我只是创建了两个类,其中一个类(在本例中为 A 类)在另一个类(在本例中为 B 类)中运行一个函数,以从数据库中获取一些信息。

但是,当B_runtime()实际调用数据库时,我得到了错误Cannot access protected property A::$db

我不明白的是,即使我__construct在两个类中都有两个,但 PDO 语句在使用 A 类的数据库连接时非常持久。

我确信这与我在 A 类中运行它的事实有关,B_runtime()因为如果我从 A 类之外调用它就不会发生这种情况。

我知道我可以简单地将protected $db;A 类中的变量更改为公共变量,但是,我真的很好奇如何解决这个问题。

ob_start();
include('/config.php');
ob_end_clean();

$A = new A($db);
$B = new B($db);

echo $A->A_runtime();

class A{
    protected $db;
    public function __construct($db){
       $this->db = $db;
    }
    public function A_runtime(){
        return B::B_runtime();      
    }
}

class B{
    protected $db;
    public function __construct($db){
       $this->db = $db;
    }
    public function B_runtime(){
        $preparedStatement = $this->db->prepare('SELECT * FROM z_mod_html WHERE ModuleLink = :moduleid LIMIT 1');
        $preparedStatement->execute(array(':moduleid' => '1'));
        $rows = $preparedStatement->fetchAll();
        return $rows[0]['HTML'];
    }
}

很抱歉有大量代码 - 如果有人有任何想法或建议,将不胜感激。谢谢。

4

2 回答 2

3

您可以将 B 的实例传递给该方法。这样,您还可以定义方法对 B 类的依赖性。

$A = new A($db);
$B = new B($db);

echo $A->A_runtime($B);

class A{
    //...
    public function A_runtime($instance){
        return $instance -> B_runtime();      
    }
}

你甚至可以在 PHP 5 中使用类型提示来表示你期望那里有一个 B 类的实例:

    public function A_runtime(B $instance){
于 2012-04-06T16:58:50.143 回答
3

哦。

首先,您将非静态方法作为静态方法调用。

B::B_runtime();

仅当 B_runtime 被声明为静态方法时才应以这种方式使用

static public function B_runtime(){

其次,您的班级具有通常被认为不好的外部依赖性。一个类应该只依赖给它的东西,而不是全局变量。这称为依赖倒置原则。如果一个类依赖于某些东西,你应该通过一个参数给它这个依赖,甚至更好的是,使用类型提示来确保依赖具有你期望的方法。

public function A_runtime(B $object_b){

为了更进一步,您还应该使用抽象或接口来进行类型提示,而不是使用具体类。这样,如果有必要,您可以将 B 换成不同版本的 B。

interface BInterface {
   public function B_runtime();
}

然后

public function A_runtime(BInterface $object_b){

阅读 OO 设计的 SOLID 原则。

http://en.wikipedia.org/wiki/SOLID_ (面向对象设计)

于 2012-04-06T17:09:11.477 回答