Класс доступа к PHP внутри другого класса - PullRequest
7 голосов
/ 19 мая 2010

Итак, у меня есть два класса, как это:

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, но это не сработало. Что мне делать, чтобы получить доступ к другому классу "foo" внутри всех методов bar?

Ответы [ 5 ]

8 голосов
/ 19 мая 2010

Вы тоже можете сделать это:

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);
4 голосов
/ 19 мая 2010

Сделайте это членом бара.Старайтесь никогда не использовать глобалы.

class bar {
    private $foo;

    public function __construct($foo) { $this->foo = $foo; }

    public function barMethod() {
        echo $this->foo->something();
    }
}
2 голосов
/ 19 мая 2010

Краткий ответ: нет, нет способа реализовать то, что вы хотите.

Еще один короткий ответ: вы работаете с классами "неправильно". Как только вы выбрали объектно-ориентированную парадигму, забудьте о «глобальном» ключевом слове.

Правильный способ сделать то, что вы хотите, - создать экземпляр foo в качестве члена bar и использовать его методы. Это называется delegation.

1 голос
/ 03 февраля 2015

И если ваш единственный фокус - сами методы, а не экземпляр другого класса, вы можете использовать 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 голосов
/ 03 февраля 2015

Один из вариантов - автозагрузка ваших классов. Кроме того, если вы сделаете свой класс статическим, вы можете вызывать его без $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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...