2012-05-29 184 views
1

所以我有一个config.php文件,它被包括在标记之前的网站上的每个页面的顶部。这个文件使用__autoload()来获得所有我使用的php类。然后,自动加载它们后,我分配类变量,像这样......调用所有其他类的类 - PHP

$myclass = new Myclass(); 
$mysecondclass = new MySecondClass(); 

当我想调用$ mysecondclass在$ MyClass的,我得到一个未定义的变量错误。这当然是因为$ mysecondclass没有在$ myclass之前定义。我如何解决这个问题,我可以从任何其他类中定义所有类?

感谢所有帮助:)

+1

你需要使用构造函数或方法 – zerkms

+2

您一般不应该访问从其他类全局变量通过'$ mysecondclass'到'$ myclass'。如果您需要从另一个类实例化一个类,请这样做,并且您的自动加载器将工作得很好。 – Brad

+0

你应该看看使用前端控制器 –

回答

4

最好的OOP方法是使用与其它类的对象特性的超对象。

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(); 
    } 
} 

你应该使用实例工厂方法或管理对象的任何机制,这些类。

要初始化MyClass你会实现这样的事情。

ObjectFactory::createObject('MyClass',$context); 
0
$myclass

Myclass它是Myclass(对象)的实例。对象不是类。如果你想在Myclass的实例中使用MySecondClass的新实例,只需在那里实例化它。

您的问题还涉及范围。您已在全局范围内创建了这两个对象。它们不能在另一个中自动访问。如果您有一些对象只有一个实例,并且您希望成为全局对象并且可以被其他对象访问,则可以使用关键字global将其导入其范围。但是,这通常不是最好的方式。相反,您可能要查找Singleton Pattern。它给你提供了一种方法来确保一个特定的类只被一次实例化,并为你提供了一种访问作为该实例化结果而创建的对象的方法。

0

注册表模式也是访问代码中任何位置的“全局”对象的简单方法。

您可以在合适的词汇来看看: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;   
    } 
} 
+0

唯一的问题是,当你有20多个完全不同的类时,事情会变得有点混乱。 –

0

根据你怎么工程类,想对其进行扩展...扩展MyClassMySecondClass自动允许访问父特性/功能。

MyClass的

class MyClass{ 
    function myFunction(){ 
     // code here 
    } 
} 

MySecondClass

class MySecondClass extends MyClass{ 
    function __construct(){ 
     $this->myFunction(); 
    } 
}