代码之家  ›  专栏  ›  技术社区  ›  Waleed Khan

另一个类中的PHP访问类

  •  7
  • Waleed Khan  · 技术社区  · 15 年前

    所以我有两门课是这样的:

    class foo {
        /* code here */
    }
    $foo = new foo();
    class bar {
        global $foo;
        public function bar () {
            echo $foo->something();
        }
    }
    

    我想在所有方法栏中访问foo的方法,而不在每个方法栏中声明它,如下所示:

    class bar {
        public function bar () {
            global $foo;
            echo $foo->something();
        }
        public function barMethod () {
            global $foo;
            echo $foo->somethingElse();
        }
        /* etc */
    }
    

    我也不想延长。我尝试使用var关键字,但似乎不起作用。如何访问bar的所有方法中的另一个类“foo”?

    5 回复  |  直到 15 年前
        1
  •  8
  •   user2453885    11 年前

    你也可以这样做:

    class bar {
        private $foo = null;
    
        function __construct($foo_instance) {
          $this->foo = $foo_instance;
        }
    
        public function bar () {
            echo $this->foo->something();
        }
        public function barMethod () {
            echo $this->foo->somethingElse();
        }
        /* etc, etc. */
    }
    

    $foo = new foo();
    $bar = new bar($foo);
    
        2
  •  4
  •   Tesserex    15 年前

    让它成为酒吧的一员。尽量不要使用globals。

    class bar {
        private $foo;
    
        public function __construct($foo) { $this->foo = $foo; }
    
        public function barMethod() {
            echo $this->foo->something();
        }
    }
    
        3
  •  2
  •   zerkms    15 年前

    简单的回答是:不,没有办法实现你想要的。

    另一个简短的回答是:你在用“错误”的方式处理课堂。一旦你选择了面向对象的范例-忘记“全局”关键字。

    正确的方法是创建 foo 作为…的成员 bar 使用它的方法。这叫做 delegation

        4
  •  1
  •   Scuzzy    11 年前

    如果您只关注方法本身,而不是另一个类的实例,那么您可以使用 x extends y

    class foo {
      function fooMethod(){
        echo 'i am foo';
      }
    }
    
    class bar extends foo {
      function barMethod(){
        echo 'i am bar';
      }
    }
    
    $instance = new bar;
    $instance->fooMethod();
    
        5
  •  0
  •   Omar    11 年前

    一个选项是自动加载类。另外,如果将类设置为静态类,则可以不使用 $classname = new classname()

    //Autoloader
    spl_autoload_register(function ($class) {
    $classDir = '/_class/';
    $classExt = '.php';
    include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt;
    });
    
    //Your code
    class bar {
        private static $foo = null; //to store the class instance
    
        public function __construct(){
            self::$foo = new foo(); //stores an instance of Foo into the class' property
        }
    
        public function bar () {
            echo self::$foo->something();
        }
    }
    

    如果将类(foo)转换为静态类

    //Autoloader
    spl_autoload_register(function ($class) {
    $classDir = '/_class/';
    $classExt = '.php';
    include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt;
    });
    
    //Your code
        class bar {
            public function bar () {
                echo foo::something();
            }
        }