Есть ли способ определить глобальную переменную, которая доступна из метода класса? - PullRequest
0 голосов
/ 14 мая 2010

Вот ситуация Я создаю экземпляр класса

$newobj = new classname1;

Затем у меня есть еще один классный класс, и я хочу, чтобы этот класс получил доступ к объекту выше

class newclass {
    public function test() {
       echo $newobj->display();
    }
}

Это не разрешено, есть ли способ определить переменную глобально через класс?

Ответы [ 4 ]

6 голосов
/ 14 мая 2010

Это разрешено , но вам нужно использовать соответствующий синтаксис: либо ключевое слово global, либо суперглобальный $GLOBALS:

http://es.php.net/manual/en/language.variables.scope.php

http://es.php.net/manual/en/reserved.variables.globals.php

<?php

class classname1{
    private $id;
    public function __construct($id){
        $this->id = $id;
    }
    public function display(){
        echo "Displaying " . $this->id . "...\n";
    }
}
$newobj = new classname1(1);

class newclass {
    public function test() {
        global $newobj;
        echo $newobj->display();
    }
    public function test_alt() {
        echo $GLOBALS['newobj']->display();
    }
}

$foo = new newclass;
$foo->test();
$foo->test_alt();

?>

Однако глобальные переменные всегда следует использовать с осторожностью. Они могут привести к коду, который трудно понять и поддерживать, и к ошибкам, которые трудно отследить. Обычно проще передать необходимые аргументы:

<?php

class classname1{
    private $id;
    public function __construct($id){
        $this->id = $id;
    }
    public function display(){
        echo "Displaying " . $this->id . "...\n";
    }
}
$newobj = new classname1(1);

class newclass {
    public function test(classname1 $newobj) {
        echo $newobj->display();
    }
}

$foo = new newclass;
$foo->test($newobj);

?>

И последнее, но не менее важное: вы можете искать шаблон ООП синглтона:

http://en.wikipedia.org/wiki/Singleton_pattern

1 голос
/ 14 мая 2010

Сделать экземпляр глобальным:

$newobj = new classname1;

class newclass {
    public function test() {
       global $newobj;
       echo $newobj->display();
    }
}

Так как я получил понижающий голос за первую строку, я удалил его.

0 голосов
/ 14 мая 2010

вы также можете унаследовать свой новый класс от classname1, и тогда вы сможете вызывать методы класса 'classname1' как это:


class newclass extends classname1 {
    public function test() {
       echo parent::display();
    }
}

0 голосов
/ 14 мая 2010

Можно посмотреть, используя шаблон синглтона . В основном это класс, который создает собственный экземпляр, и последующие вызовы будут обращаться к этому экземпляру и, следовательно, достигать того, что, я думаю, вы могли бы до ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...