【问题标题】:Calling classes from all other classes - PHP从所有其他类调用类 - PHP
【发布时间】:2012-06-03 06:45:13
【问题描述】:

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

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

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

感谢您的帮助:)

【问题讨论】:

  • 您需要使用构造函数或方法将$mysecondclass 传递给$myclass
  • 您通常不应该从其他类访问全局变量。如果你需要从另一个类实例化一个类,那么你的自动加载器就可以正常工作了。
  • 你应该考虑使用前端控制器

标签: php oop class variables instantiation


【解决方案1】:

最好的 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);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      注册表模式也是一种在代码中任意位置访问“全局”对象的简便方法。

      你可以看看 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;        
          }
      }
      

      【讨论】:

      • 唯一的问题是,当你有 20 多个完全不同的类时,事情会变得有点混乱。
      【解决方案4】:

      根据您的类的工作方式,考虑扩展它们...将MyClass 扩展为MySecondClass 会自动授予对父属性/函数的访问权限。

      我的班级

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

      我的第二类

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多