как имитировать шаблоны классов в PHP - PullRequest
2 голосов
/ 27 января 2010

Как имитировать классы шаблонов C ++ в PHP?

EDITED1

Например, как это будет в PHP?

template  <typename T>
class MyQueue
{
         std::vector<T> data;
      public:
         void Add(T const &d);
         void Remove();
         void Print();
};

Ответы [ 3 ]

4 голосов
/ 27 января 2010

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

Edit: В ответ на ваш пример, в php вы будете обязаны знать тип, который находится в списке. Все принимаются по списку.

1 голос
/ 28 января 2010

Преобразование вашего кода C ++ в PHP:

class MyQueue{
  private $data;
  public function Add($d);
  public function Remove();
  public function Print();
};

Как объяснил Тирлер, PHP является динамическим, поэтому вы можете передавать все что угодно в функцию Add и хранить любые значения в $ data. Если вы действительно хотите добавить безопасность типов, вам нужно передать тип, который вы хотите разрешить, конструктору.

public function __construct($t){
   $this->type = $t;
}

Затем вы можете добавить некоторые проверки в другие функции, используя оператор instanceof .

public function Add($d){
    if ( !($d instanceof $this->type ){
        throw new TypeException("The value passed to the function was not a {$this->type}");
    }
    //rest of the code here
}

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

0 голосов
/ 28 января 2010

PHP имеет невероятно полезные массивы, которые принимают любой тип в качестве значения и любой скаляр в качестве ключа.

Лучший перевод вашего примера -

class MyQueue {
  private $data = array();

  public function Add($item) {
    $this->data[] = $item; //adds item to end of array
  }

  public function Remove() {
    //removes first item in array and returns it, or null if array is empty
    return array_shift($this->data); 
  }

  public function Print() {
    foreach($this->data as $item) {
      echo "Item: ".$item."<br/>\n";
    }
  }

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