所以我有一个config.php文件,它包含在标记之前的网站上的每个页面的顶部。这个文件使用__autoload()来获取我使用的所有php类。然后,在自动加载它们之后,我将类分配给变量,如此...
$myclass = new Myclass();
$mysecondclass = new MySecondClass();
当我想在$ myclass中调用$ mysecondclass时,我得到一个未定义的变量错误。这当然是因为在$ myclass之前没有定义$ mysecondclass。我如何解决这个问题,我可以从任何其他类定义所有类?
感谢您的帮助:)
答案 0 :(得分:4)
最好的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);
答案 1 :(得分:0)
$myclass
不是Myclass
它是Myclass
(对象)的实例。对象不是类。如果要在MySecondClass
实例中使用Myclass
的新实例,只需在其中实例化它即可。
您的问题也涉及范围。您已在全局范围中创建了这两个对象。它们不能彼此自动访问。如果您有一些对象,您只有一个实例,并且您希望它是全局的并且可供其他人访问,则可以使用global
关键字将其导入其范围。但是,这通常不是最好的方法。相反,您可能想要查找Singleton Pattern
。它为您提供了一种方法来确保特定类只被实例化一次,并为您提供了一种方法来访问由于该实例化而创建的对象。
答案 2 :(得分:0)
注册表模式也是在代码中的任何位置访问“全局”对象的简单方法。
你可以看一下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;
}
}
答案 3 :(得分:0)
根据您的课程的工作方式,考虑扩展它们......将MyClass
扩展到MySecondClass
会自动提供对父属性/功能的访问。
MyClass的
class MyClass{
function myFunction(){
// code here
}
}
MySecondClass
class MySecondClass extends MyClass{
function __construct(){
$this->myFunction();
}
}