2016-11-09 3 views
0

После нескольких попыток по какой-то причине я получаю сообщение об ошибке Access to undeclared static property, когда пытаюсь сделать объект из своего класса.PHP | Доступ к необъявленному статическому свойству

Мой класс:

final class repo { 
    var $b; 

    /** 
    * @var \Guzzle\Http\Client 
    */ 
    protected $client; 

    function repo($myvar) 
    { 
     static::$b = $myvar; 
     $this->client = $b; 
    } 
} 

мне сделать объект:

$myobj = new repo("test"); 
+3

'$ b' не является статическим приличием. '$ this-> b = $ myvar' или' public static $ b; ' – Federkun

+0

Вы должны инициализировать $ b как ** public static $ b **. Если вы не можете его использовать. –

+2

'var $ b;'. Вы хотите поддержать php4? Или вы просто прочитали очень старый учебник? –

ответ

0

Вы должны объявить $ Ь в качестве статической переменной.

отметить также, что метод, как имя класса является устаревшим в настоящее время see the details here

final class repo { 
    public static $b; 

    /** 
    * @var \Guzzle\Http\Client 
    */ 
    protected $client; 

    function repo($myvar) 
    { 
     static::$b = $myvar; 
     $this->client = static::$b; 
    } 
} 
+1

Почему вы изменили 'static :: $ b = $ myvar;' на '$ this-> b = $ myvar;' then? – Federkun

+0

@Federkun Оба одинаковы, он является членом класса, поэтому я использовал '$ this', но мы также можем использовать разрешение области для достижения того же. Есть ли проблема? – Tiger

+0

Вы пробовали? http://stackoverflow.com/questions/151969/when-to-use-self-over-this – Federkun

0

Декларация var $b; является PHP 4. PHP 5 позволяет это, и это эквивалентно public $b;.

Однако он устарел, и если вы используете надлежащую отчетность об ошибках (error_reporting(E_ALL); во время разработки), вы получите предупреждение об этом. Вместо этого вы должны использовать PHP 5 visibility kewords.

Кроме того, объявление function repo($myvar) является конструктором типа PHP 4, также принятым, но устаревшим. Вы должны использовать синтаксис PHP 5 __constructor().

Вы получаете $b как static::$b, и это не соответствует его заявлению (эквивалент, как я сказал выше, с public $b). Если вы хотите, чтобы это свойство класса (это то, что делает static), вы должны объявить его как свойство класса (т. Е. public static $b).

Сложив все вместе, правильный способом, чтобы написать свой класс является:

final class repo { 
    // public static members are global variables; avoid making them public 
    /** @var \Guzzle\Http\Client */ 
    private static $b; 

    // since the class is final, "protected" is the same as "private" 
    /** @var \Guzzle\Http\Client */ 
    protected $client; 

    // PHP 5 constructor. public to allow the class to be instantiated. 
    // $myvar is probably a \Guzzle\Http\Client object 
    public __construct(\Guzzle\Http\Client $myvar) 
    { 
     static::$b = $myvar; 
     // $this->b probably works but static::$b is more clear 
     // because $b is a class property not an instance property 
     $this->client = static::$b; 
    } 
} 
0

Попробуйте

final class repo { 
    public $b; 

    /** 
    * @var \Guzzle\Http\Client 
    */ 
    protected $client; 

    function repo($myvar) 
    { 
     $this->b = $myvar; 
     $this->client = $this->b; 
    } 
} 

Примечания: статический ::/само :: используется на статических функциях.