【问题标题】:Global class - using class全局类 - 使用类
【发布时间】:2013-01-12 08:39:56
【问题描述】:

我目前面临一个问题,我正在编写代码,我需要在另一个类中使用一个类。目前,我是这样解决问题的:

   class foo {
        private $bar;
        function __construct() {
            $this->bar = new different_class();
        }
    }

但是,当我需要使用超过 1 个类时,代码会变得有点冗长和混乱。有没有其他方法可以做到这一点?

我的想法是创建某种可以直接调用的全局类:

class foo{
        function hello(){
            return "Hello";
        }
    }
class bar{
        function hi(){
            return $foo->hello();
        }
    }

这可能吗? 非常感谢!

【问题讨论】:

    标签: php class scope


    【解决方案1】:

    查找静态关键字。

    http://www.php.net/manual/en/language.oop5.static.php

    您可能不需要整个静态类,但这取决于您的设计计划。

    【讨论】:

      【解决方案2】:

      静态方法或继承怎么样?

      静态方法

      class foo {
         public static function hello() {
            return 'Hello';
         }
      } 
      
      class bar {
         public function hi() {
           return foo::hello();
         }
       }
      

      继承

      class foo {
          public function hello() {
             return 'Hello';
          } 
      }
      
      class bar extends foo {
         public function hi() {
           return $this->hello(); // Will return foo->hello()
         }
      }
      

      【讨论】:

      • 我不能通过继承来做到这一点,这使得它的可读性更差。调用静态方法时,类构造函数不会执行吗?因为那可能是另一个问题。谢谢!
      【解决方案3】:

      正如其他人所提到的,您有三个选择:

      • 使用static 方法,该方法不需要您实例化类。
      • 使第二个类成为第一个类的子类。
      • 在第一个类中实例化第二个类。 (这就是您在上面的第一个示例中所做的。)

      使用您给出的确切示例,static 方法将起作用。然而,static 方法有真正的局限性——它只能用于返回常量或其他static 属性。

      因此,根据所涉及的实际类的复杂性,static 在许多情况下很可能不是一个可行的选择。

      如果是这种情况,完全按照您在上面第一个示例中所做的操作是正确的选择。

      【讨论】:

      • 我害怕这个答案:/ 好吧,我认为,我唯一的方法是以某种方式结合这三个选项以使代码更清晰。非常感谢!
      【解决方案4】:

      为什么不在参数中传递一个实例?

       class Foo {
          public function hello(){
             return "Hello";
          }
       } 
       class Bar{
          function hi( Foo $foo ){
             return $foo->hello();
           }
       }
      

      或者恕我直言,更好的是:不要对类进行硬编码,而是使用dependency injection。你传入参数一个接口。所有实现该接口的类都可以作为参数传递。

       interface MyInterface {
          public function hello();
       }
      
       class Foo implements MyInterface {
          function hello(){
             return "Hello";
          }
       } 
      
       class Bar{
          function hi( MyInterface $foo ){
             return $foo->hello();
           }
       }
      

      使用界面回答您的问题:

         class foo {
              private $bar;
              function __construct( AnInterface $different_class ) {
                  $this->bar = different_class;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2018-08-16
        • 2011-09-05
        • 2012-08-09
        • 1970-01-01
        • 2013-12-20
        • 2021-12-17
        • 2014-08-22
        • 1970-01-01
        相关资源
        最近更新 更多