类构造函数干扰另一类

时间:2012-04-06 16:51:06

标签: php class function variables constructor

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

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

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

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

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

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'];
    }
}

对于大量的代码感到抱歉 - 如果有人有任何想法或建议,我们将不胜感激。感谢。

2 个答案:

答案 0 :(得分: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中使用type hinting来表示你期望在那里有一个B类实例:

    public function A_runtime(B $instance){

答案 1 :(得分:3)

Oy公司。

首先,您将非静态方法称为静态方法。

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_(object-oriented_design