2010-01-29 22 views
2

Je veux dire si elle est appelée avec $request qui n'est pas l'instance de sfWebRequest, sera-t-elle fatale, ou juste un avertissement?La signature de méthode dans PHP est-elle OBLIGATOIRE ou DEVRAIT?

class jobActions extends sfActions 
{ 
    public function executeIndex(sfWebRequest $request) 
    { 
    $this->jobeet_job_list = Doctrine::getTable('JobeetJob') 
     ->createQuery('a') 
     ->execute(); 
    } 

    // ... 
} 
+1

Avez-vous l'essayer? – Gumbo

+0

Pas encore, le framework prendra des jours à apprendre.Mais je suis curieux du résultat – user261527

+1

@unknown: Mais vous pourriez construire un cas de test simple avec seulement deux classes simples comme: 'class A {} classe B {public static function foo (A $ obj) {}} B :: foo (nouveau A()); B :: foo ("not A"); ' – Gumbo

Répondre

1

Ce sera une erreur fatale capturable.

Voici un exemple:

class MyObj {} 

function act(MyObj $o) 
{ 
    echo "ok\n"; 
} 

function handle_errors($errno, $str, $file, $line, $context) 
{ 
    echo "Caught error " . $errno . "\n"; 
} 

set_error_handler('handle_errors'); 

act(new stdClass()); 
/* Prints                  
*                    
* Caught error 4096                
* ok                   
*/ 

S'il n'y avait pas un appel set_error_handler le code échouera avec une erreur:

Catchable fatal error: Argument 1 passed to act() must be an instance of MyObj, 
instance of stdClass given, called in /home/test/t.php on line 16 and defined in 
/home/test/t.php on line 4 
+0

Qu'entendez-vous par' récupérable'? – user261527

+0

Vous pouvez l'attraper. – Thomas

5

Voir le chapitre sur TypeHinting in the PHP Manual

Si $request n'est pas une instance sfWebRequestou sous-classe de celle-ci ou en mettant en œuvre un interface de ce nom, la méthode soulèvera un catchable fatal error. L'exécution du script se terminera si l'erreur n'est pas gérée.

Exemple

class A {} 
class B extends A {} 
class C {} 

function foo(A $obj) {} 

foo(new A); 
foo(new B); 
foo(new C); // will raise an error and terminate script 

Avec les interfaces

interface A {} 
class B implements A {} 
class C {} 

function foo(A $obj) {} 

foo(new B); 
foo(new C); // will raise an error and terminate script