1

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

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

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

谢谢你的帮助:)

4

4 回答 4

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

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

要初始化MyClass,您将实现类似这样的东西。

ObjectFactory::createObject('MyClass',$context);
于 2012-05-29T02:41:48.663 回答
0

$myclass是不是Myclass它是Myclass(对象)的一个实例。对象不是类。如果您想在 的实例中使用 的新实例MySecondClassMyclass只需在其中实例化它即可。

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

于 2012-05-29T02:43:02.967 回答
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;        
    }
}
于 2012-05-29T03:00:05.420 回答
0

根据您的类的工作方式,考虑扩展它们...扩展MyClassMySecondClass自动提供对父属性/函数的访问。

我的课

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

我的第二类

class MySecondClass extends MyClass{
    function __construct(){
         $this->myFunction();
    }
}
于 2012-05-29T03:09:04.867 回答