如何在没有冲突的情况下调用php中的不同类成员?

时间:2015-07-16 00:53:12

标签: php class oop inheritance

我有4个类,其中1个是包含所有常规对象的主类。 其他3个是情境类(因为缺少更好的单词,因为它们根据需要包含在脚本的不同部分中)

我想访问所有三个班级'来自主类的方法和对象(或至少只是方法)并访问主类'来自其他三个类的方法和变量,AND共享所有类之间的访问,这样我就可以从任何类调用任何类的任何方法。

我知道我可以让其他三个类成为主类的成员:

class Main
{
    public $test = 'test';

    public function __construct ($classA, $classB, $classC)
    {
        $this -> classA = $classA;
        $this -> classB = $classB;
        $this -> classC = $classC;

        echo 'Main just got constructed!';
    }
    public function test()
    {
        echo $this -> test;
    }
}
class A extends Main
{
    public function TestA()
    {
        echo 'In Class A';
    }
}
class B extends Main
{
    public function __construct()
    {
        echo 'B just got constructed!';
    }
    public function TestB()
    {
        echo 'In Class B';
    }
}

class C extends Main
{
    public function TestC()
    {
        echo 'In Class C';

        // can we access B from here? probably not.
        // would B::TestB() work?

        B::TestB();

        // yes it does.
        // but is there any other way of accessing the method? like $this -> TestB()? apart from extending the B class to C.
        // Is there any downside to using this way of accessing methods and variables? what are the cons?
    }
}
$A = new A;
$B = new B;
$C = new C;
$Main = new Main ($A, $B, $C);

$C -> TestC();
$Main -> classC -> TestC();

第一个问题是,将Main类扩展到其他类会抛出警告,因为Main类中缺少__construct()的参数:

Warning: Missing argument 1 for Main::__construct()

另一个问题是,如果我使用这种方法,则必须在Main Class之前启动所有三个类。但是我的脚本需要在一开始就执行主类,因为它建立了与mysql的连接并设置了环境变量等。另外,没有必要同时使用所有三个类,所以在网站的某些部分,只需要一个类,在这些部分中启动其他类是没有意义的。 (我有4个以上的课程,这只是为了让事情更简单)。在这种情况下,如何在其他类成员启动后使其成为主?

另一件事,在其他类中扩展Main类三次似乎分别启动Main类三次..这是重置主类'对象与其他类访问时不一样。当测试代码抛出时,我发现了这个问题" Main刚刚构建好了!"三次,它将变量设置为默认值。怎么避免呢?我想要主要班级'变量在所有其他类中具有相同的值。有点像全局变量。

1 个答案:

答案 0 :(得分:0)

嗯,因为你有对象"注入"在创建Main实例之后或之前,您可能希望在Main类中添加um方法寄存器。此外,只要每个类必须能够访问另一个(例如链接),您就可以添加一个属性(可能是$ main)和Main类的实例。 我认为它可能有用:

<?php

class A 
{
    /**
     * @var Main
     */
    public $main; # Main class

    public function test()
    {
        #$this->main->aInstance->someMethod();
        #$this->main->bInstance->someMethod();  
        // ...  
        return __METHOD__; 
    }
}

class B
{
    /**
     * @var Main
     */
    public $main; 

    public function test()
    {
        return __METHOD__; 
    }
}


class Main 
{
    public $objectPool  = array();

    public function __construct(array $objects = array())
    {
        foreach ($objects as $object) {
            $object->main = $this;
            # add...
            $this->addObject($object);
        }
    }

    public function addObject($object)
    {
        $this->objectPool[ get_class($object) ] = $object;  
    }

    public function getObject($classname)
    {
        if (array_key_exists($classname, $this->objectPool)) {
            return $this->objectPool[$classname];
        }

        return null; # Or raise an Excetion?
    }

    public function test()
    {
        return get_class($this); 
    }
}

$obj  = array(new A, new B);
$main = new Main($obj);

var_dump($main->getObject('B')->main->test());
var_dump($main->getObject('B')->test());
var_dump($obj[1]->main->getObject('A')->test());

但是,我认为这些对象对每个对象都知之甚少(这不是一个好主意 - 实际上是糟糕的设计)。

以下是可运行的代码:http://3v4l.org/Y19Kr