2013-06-13 4 views
0

Quand je lance ce codetype hinting et méthodes statiques

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(); 

J'obtiens l'erreur

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

Est-ce que cela signifie que le type hinting ne fonctionne que pour les instances, mais pas pour les méthodes statiques? Si maintenant, comment obtenir des indications de type pour les méthodes statiques?

+0

'poignée()' attend un objet de la classe 'Settings' mais vous simplement fournir un tableau simple (la valeur de retour de 'appConfig()') – x4rf41

+0

la valeur de retour de appConfig n'est pas une instance de la classe Settings, vous ne pouvez pas donner un tableau de type à une méthode qui veut obtenir un paramétrage de type – steven

Répondre

0

Eh bien, le texte d'erreur l'explique. Vous passez un tableau ici:

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

Parce que votre méthode Settings::appConfig() retourne un tableau. Vous devez passer une instance là-bas.

0

$ conf doit être une instance de l'objet Settings pour éviter l'erreur.

L'indicateur de classe de méthodes de handle signifie que seules les instances d'objets de la classe Settings seront acceptées. Si vous souhaitez utiliser un tableau avec la méthode du handle, vous devez effectuer cette modification.

public function handle(Settings $conf) 

à

public function handle(array $conf) 
0

cela fonctionnerait:

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