ОБЯЗАТЕЛЬНО или ДОЛЖЕН подпись метода в PHP? - PullRequest
2 голосов
/ 29 января 2010

Я имею в виду, если он вызывается с $request, который не является экземпляром sfWebRequest, будет ли это фатальным или просто предупреждением?

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

  // ...
}

Ответы [ 2 ]

5 голосов
/ 29 января 2010

См. Главу о TypeHinting в руководстве по PHP

Если $request не является sfWebRequest экземпляром или его подклассом или , реализующим интерфейс этого имени, метод вызовет ловимая фатальная ошибка . Выполнение сценария прекратится, если ошибка не будет обработана.

Пример

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

с интерфейсами

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
1 голос
/ 29 января 2010

Это будет перехватываемая фатальная ошибка.

Вот пример:

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                                                                           
 */

Если не было вызова set_error_handler, код завершится с ошибкой:

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
...