2011-01-12 3 views
1

Я создал класс, который вызывает объект в «__construct», как я могу сделать этот объект доступным через класс.Как сделать объект общедоступным для всех функций в классе?

class SocialMedia { function __construct() { $object = "whatever"; } } 

Как я могу получить доступ к $ объекту в других функциях (которые являются статическими) из класса в классе. Я попытался использовать объект «$ this->», но при попытке вызвать его из других моих статических функций я получаю сообщение об ошибке «$ this, когда не в объектном контексте».

+0

Я также пытался сделать объект $ public открытым, но до сих пор не могу получить доступ к объекту. –

ответ

5

Использование

self::$object = 'whatever' 

вместо и читать PHP Manual on the static keyword

Замечание, что statics are death to testability, так что вы можете просто хорошо забыть, что вы только что узнали, и использовать переменные экземпляра вместо этого.

+0

спасибо за ссылку, это было хорошо прочитано. Я использовал «что угодно» в качестве примера. действительно, я инициализирую класс/lib (sdk в facebook), который может быть создан только один раз при запуске скрипта. –

+0

@thesocialhacker, тогда сделайте это в своем файле начальной загрузки и передайте экземпляр любым объектам, которые в нем нуждаются. Это называется Injection Dependency Injection, и это сделает ваше приложение более удобным для обслуживания в долгосрочной перспективе. – Gordon

+0

спасибо, я передам это нашему ведущему разработчику. Посмотрите, есть ли у него какие-либо идеи о том, как мне поступить иначе. –

2

Попробуйте определить свой объект внутри области действия класса, прямо над функцией. Итак, в качестве примера:

class SocialMedia { public $object; function __construct() { $object = "whatever"; } } 

Или вы могли бы попытаться определить его как «public static» вместо «public». В качестве примера, это:

class SocialMedia { public static $object; function __construct() { $object = "whatever"; } } 
1

Если $object не статична, то у вас есть проблемы. Вы должны иметь возможность ссылаться на конкретный экземпляр класса. Youll нужно передать фактический экземпляр SocialMedia его статический метод или придумать с некоторыми другими махинациями:

public static function someMethod(SocialMedia $instance, $args) 
{ 
    // do stuff with $instance->object and $args 
} 

public function methodThatUsesStaticMethod($args) 
{ 
    self::someMethod($this, $args); 
} 

Если $object является статическим, то вы можете использовать оператор разрешения области видимости для доступа к нему, как уже упоминалось:

Но тогда у вас есть еще одна проблема ... Что произойдет, если не был создан экземпляр SocialMedia, и поэтому SocialMedia::$object еще не установлен?

2

сделать его статическим:

class SocialMedia { 

    protected static $object; 

    function __construct() { 
     self::$object = "whatever"; 
    } 
} 
0

Вы могли бы сделать ваш класс одноэлементно (OOP Patterns in PHP Manual), но это на самом деле не лучше решение, если вы хотите Тестируемость и/или зависимость инъекции. Независимо от того, как вы его рекламируете, вы после глобальной переменной, и рано или поздно вы узнаете все неприятности, которые они приносят.

Смежные вопросы