从所有其他类调用类 - PHP

时间:2012-05-29 02:33:38

标签: php oop class variables instantiation

所以我有一个config.php文件,它包含在标记之前的网站上的每个页面的顶部。这个文件使用__autoload()来获取我使用的所有php类。然后,在自动加载它们之后,我将类分配给变量,如此...

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

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

感谢您的帮助:)

4 个答案:

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