所以我有一个config.php文件,它包含在网站上每个页面的顶部,在标签之前。这个文件使用 __autoload() 来获取我使用的所有 php 类。然后,在自动加载它们之后,我将类分配给这样的变量......
$myclass = new Myclass();
$mysecondclass = new MySecondClass();
当我想在$myclass中调用$mysecondclass时,我收到一个未定义的变量错误。这当然是因为$mysecondclass在$myclass之前没有定义。如何解决此问题,我可以定义任何其他类的所有类?
感谢您的任何帮助:)
最好的 OOP 方法是使用具有其他类对象的属性的 superObject。
class Context{
var $myClass;
var $myOtherClass;
var $db;
//...
}
在您的MyClass
class MyClass{
var $context;
public function __construct(&context){
$this->context = $context;
}
public function otherFunction(){
$this->context->myOtherClass->functionFromOtherClass();
}
}
您应该使用 Factory 方法或任何机制来管理对象来实例化这些类。
要初始化MyClass
,您将实现类似的东西。
ObjectFactory::createObject('MyClass',$context);
$myclass
不是Myclass
它是Myclass
(一个对象)的实例。对象不是类。如果要在Myclass
实例中使用新的MySecondClass
实例,只需在其中实例化即可。
你的问题也涉及范围。您已在全局范围内创建了这两个对象。它们不能在彼此内部自动访问。如果你有一个对象,你将只有一个实例,并且你希望它是全局的,并且其他人可以访问,你可以使用 global
关键字将其导入到他们的范围内。但是,这通常不是最好的方法。相反,您可能需要查找Singleton Pattern
。它为您提供了一种确保特定类仅实例化一次的方法,并为您提供了一种访问由于该实例化而创建的对象的方法。
注册表模式也是访问代码中任何位置的"全局"对象的简单方法。
你可以看看Zend_Registry:http://framework.zend.com/manual/en/zend.registry.using.html
$myclass = new Myclass();
$mysecondclass = new MySecondClass();
Zend_Registry::set('mysecondclass', $mysecondclass);
$myclass->doSomething();
class Myclass
{
public function doSomething()
{
// use $mysecondclass via the registry
Zend_Registry::get('mysecondclass')->methodFromSecondClass();
}
}
class MySecondClass
{
public function methodFromSecondClass()
{
return true;
}
}
根据类的工作方式,考虑扩展它们...将MyClass
扩展到MySecondClass
会自动提供对父属性/函数的访问权限。
我的类
class MyClass{
function myFunction(){
// code here
}
}
我的二等舱
class MySecondClass extends MyClass{
function __construct(){
$this->myFunction();
}
}