Как предотвратить использование неверного типа в PHP? - PullRequest
3 голосов
/ 26 сентября 2008

PHP, как мы все знаем, очень слабо напечатан. Язык не требует указывать какой-либо тип для параметров функции или переменных класса. Это может быть мощной функцией.

Иногда, однако, это может сделать отладку вашего скрипта болезненным процессом. Например, передача объекта одного типа в метод, который ожидает объект другого типа, может привести к появлению сообщений об ошибках, сообщающих, что для переданного объекта не существует определенной переменной / метода. Эти ситуации в основном раздражают. Более обременительные проблемы возникают, когда вы инициализируете один объект объектом неправильного класса, и этот «неправильный объект» не будет использоваться до тех пор, пока не будет выполнен сценарий. В этом случае вы получите ошибку намного позже, чем когда вы передали исходный аргумент.

Вместо того, чтобы жаловаться, что у того, что я передал, нет определенного метода или переменной, или ждать намного позже выполнения сценария для использования моего переданного объекта, Я бы предпочел ошибку сообщение, где именно я указываю объект неправильного типа, с жалобой на неправильный или несовместимый тип объекта.

Как вы справляетесь с этими ситуациями в своем коде? Как вы обнаруживаете несовместимые типы? Как я могу ввести некоторые проверки типов в свои сценарии, чтобы я мог получить более понятные сообщения об ошибках?

Кроме того, как вы можете делать все это при учете наследования в Php? Рассмотрим:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

Затем пользователь этого кода реализует интерфейс со своим собственным конкретным классом:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

Я хочу, чтобы экземпляры ConcreteClass и все будущие неизвестные пользовательские объекты также были приемлемы для SetObject. Как бы вы сделали это допустимым при проверке правильности типа?

Ответы [ 7 ]

11 голосов
/ 26 сентября 2008

На самом деле для классов вы можете предоставить подсказку типа в PHP (5+).

 <?php
 class UsesBaseClass
 {
      function SetObject(InterfaceObject $obj) 
      {
      }
 }
 ?>

Это также будет работать правильно с наследованием, как и следовало ожидать.

Как отступление, не помещайте слово "объект" в имена ваших классов ...

4 голосов
/ 26 сентября 2008

в качестве дополнения к ответу Эрана Гальперина вы также можете использовать подсказку типа, чтобы заставить параметры быть массивами, а не просто объектами определенного класса.

<?php
class MyCoolClass {
   public function passMeAnArray(array $array = array()) {
      // do something with the array  
   }  
 }  
 ?>

Как видите, вы можете ввести подсказку, что метод ::passMeAnArray() ожидает array, а также указать значение по умолчанию в случае, если метод вызывается без каких-либо параметров.

2 голосов
/ 04 октября 2008

Для примитивных типов вы также можете использовать функции is_ *:

public function Add($a, $b)
{
  if (!is_int($a) || !is_int($b))
    throw new InvalidArgumentException();
  return $a + $b;
}
1 голос
/ 27 сентября 2008

Даже в описанном вами случае ваш скрипт будет аварийно завершать работу, жалуясь, что в объекте Y нет метода / атрибута X, поэтому вы будете знать, откуда это происходит.

В любом случае, я думаю, что всегда пытаться помешать взрослым программистам передавать неправильный объект методу - это не хорошее вложение времени: вы могли бы потратить его на документирование и обучение.

Утиная печать и внимательные коллеги - это то, что вам нужно, а не дополнительные проверки, которые сделают ваше приложение более жестким.

Но это может быть точка зрения Pythonista ...

1 голос
/ 26 сентября 2008

Видите ли, есть несколько ответов о подсказке типа. Это техническое решение. Но вы также должны убедиться, что весь дизайн является разумным и интуитивно понятным. Это сделает проблемы типов и ошибки более редкими.

Помните, что даже эти сбои типов будут генерироваться во время выполнения . Убедитесь, что у вас есть тесты для кода.

1 голос
/ 26 сентября 2008

@ Ответ Эрана Гальперина является предпочтительным методом для обеспечения правильности типа используемого вами объекта.

Также стоит отметить оператор instanceOf - это полезно, когда вы хотите проверить, является ли объект одним из нескольких типов.

0 голосов
/ 26 сентября 2008

Вы можете установить параметр ini error_reporting в файле php.ini или использовать функцию error_reporting, чтобы установить его во время выполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...