我有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刚刚构建好了!"三次,它将变量设置为默认值。怎么避免呢?我想要主要班级'变量在所有其他类中具有相同的值。有点像全局变量。
答案 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