Подтвердить что ты не робот

Способ указать тип класса объекта в PHP

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

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


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

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

4b9b3361

Ответ 1

В дополнение к уже указанному 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 в предоставлении Code Assistance.

Ответ 2

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

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

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

но это не так:

class MyClass
  {
    public OtherClass $otherclass;

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

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

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

Ответ 3

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

Ответ 4

Вы можете указать тип объекта, введя объект в переменную var с помощью типа-подсказки в параметре метода 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;
    }
}