从所有其他类调用类 - PHP


Calling classes from all other classes - PHP

所以我有一个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();
    }
}