2013-06-13 4 views
0

Когда я запускаю этот кодТип намекая и статические методы

class Kernel 
{ 
    private $settings = array(); 

    public function handle(Settings $conf) 
    { 
     $this->settings = $conf; 
     return $this; 
    } 


    public function run() 
    { 
     var_dump($this->settings); 
    } 
} 


class Settings 
{ 
    public static function appConfig() 
    { 
     return array(
      'database' => array(
       'hostname' => 'localhost', 
       'username' => 'root', 
       'password' => 'test', 
       'database' => 'testdb' 
      ) 
     ); 
    } 
} 

$kernel = new Kernel; 
$kernel->handle(Settings::appConfig())->run(); 

Я получаю ошибку

Catchable fatal error: Argument 1 passed to Kernel::handle() must be an instance of Settings, array given, called in.... 

Означает ли это, что тип намекая работает только для случаев, но не для статических методов? Если теперь, как достичь типа намека на статические методы?

+0

'ручку()' ожидает объект класса 'Settings' но вы просто предоставляя простой массив (возвращаемое значение из 'appConfig()') – x4rf41

+0

возвращаемое значение appConfig не является экземпляром класса Settings, вы не можете дать массив типов методу, который хочет получить настройки типа – steven

ответ

0

Ну, текст ошибки объясняет это. Вы передаете массив здесь:

$kernel->handle(Settings::appConfig())->run(); 

Поскольку ваш метод Settings::appConfig() возвращает массив. Вы должны передать экземпляр там.

0

$ conf должен быть экземпляром объекта Settings для предотвращения ошибки.

Подсказка класса методов handle означает, что только объекты экземпляров класса настроек будут приняты. Если вы хотите использовать массив с методом handle, вам нужно внести это изменение.

public function handle(Settings $conf) 

в

public function handle(array $conf) 
0

это будет работать:

public function handle(array $conf) 
{ 
    $this->settings = $conf; 
    return $this; 
} 
Смежные вопросы