способ указать тип класса объекта в PHP - PullRequest
11 голосов
/ 02 июля 2010

Есть ли способ указать тип атрибута объекта в PHP? например, у меня было бы что-то вроде:

class foo{
 public bar $megacool;//this is a 'bar' object
 public bar2 $megasupercool;//this is a 'bar2' object
}


class bar{...}
class bar2{...}

Если нет, знаете ли вы, будет ли это возможно в одной из будущих версий PHP, однажды?

Ответы [ 4 ]

11 голосов
/ 02 июля 2010

В дополнение к уже упомянутой TypeHinting вы можете задокументировать свойство, например,

class FileFinder
{
    /**
     * The Query to run against the FileSystem
     * @var \FileFinder\FileQuery;
     */
    protected $_query;

    /**
     * Contains the result of the FileQuery
     * @var Array
     */
    protected $_result;

 // ... more code

. @var annotation поможет некоторым IDE в предоставлении помощи по коду.

6 голосов
/ 02 июля 2010

То, что вы ищете, называется Type Hinting и частично доступно с PHP 5 / 5.1 в объявлениях функций, но не так, как вы хотите использовать его в определении класса.

Это работает:

<?php
class MyClass
{
   public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }

но это не так:

class MyClass
  {
    public OtherClass $otherclass;

Я не думаю, что это запланировано на будущее, по крайней мере, я не знаю, что это запланировано для PHP 6.

вы можете, однако, применить свои собственные правила проверки типов, используя функции получения и установки в вашем объекте. Впрочем, он не будет таким же элегантным, как OtherClass $otherclass.

Руководство по PHP для подсказок типа

2 голосов
/ 02 июля 2010

Нет.Вы можете использовать type hinting для параметров функции, но вы не можете объявить тип переменной или атрибута класса.

0 голосов
/ 02 июля 2010

Вы можете указать тип объекта, одновременно вводя объект в переменную через подсказку типа в параметре метода setter. Как это:

class foo
{
    public bar $megacol;
    public bar2 $megasupercol;

    function setMegacol(bar $megacol) // Here you make sure, that this must be an object of type "bar"
    {
        $this->megacol = $megacol;
    }

    function setMegacol(bar2 $megasupercol) // Here you make sure, that this must be an object of type "bar2"
    {
        $this->megasupercol = $megasupercol;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...