PHP access class inside another class

后端 未结 5 1113
独厮守ぢ
独厮守ぢ 2021-01-12 09:57

So I have two classes like this:

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


        
相关标签:
5条回答
  • 2021-01-12 10:18

    An option is to autoload your classes. Also, if you make your class a static class, you can call it without $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();
        }
    }
    

    If you convert your class (foo) into a static class

    //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();
            }
        }
    
    0 讨论(0)
  • 2021-01-12 10:20

    The short answer: nope, there is no way to implement what you want.

    Another short answer: you're working with classes in "wrong" way. Once you selected Object Oriented paradigm - forget about "global" keyword.

    The proper way of doing what you want is to create an instance of foo as member of bar and use it's methods. This is called delegation.

    0 讨论(0)
  • 2021-01-12 10:30

    Make it a member of bar. Try to never use globals.

    class bar {
        private $foo;
    
        public function __construct($foo) { $this->foo = $foo; }
    
        public function barMethod() {
            echo $this->foo->something();
        }
    }
    
    0 讨论(0)
  • 2021-01-12 10:41

    You could do like this too:

    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. */
    }
    

    Later you could do:

    $foo = new foo();
    $bar = new bar($foo);
    
    0 讨论(0)
  • 2021-01-12 10:41

    And if your only focus is the methods themselves as opposed to the instance of another class, you can use 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();
    
    0 讨论(0)
提交回复
热议问题