2015-11-20 4 views
0

Я пишу custom система расширения для php, которая позволяет определять класс с новой функцией для существующего класса и добавлять указанные функции к классу после его определения.Настроить тип hinting в PHP

Как уже говорилось, расширения написаны как отдельный класс, позвоните один из MyExtension и скажем, что это расширение распространяется на существующие классы, MyExtendedClass1 и MyExtendedClass2. Таким образом, MyExtension добавляет некоторые функции к MyExtendedClass1 И MyExtendedClass2.

Что я хочу сделать, это позволить пользователям набирать базу подсказок на MyExtension.

// $object is guaranteed to either be an instance of MyExtension 
// or be a class that is extended with MyExtension 
function someFunction(MyExtension $object) { 

} 
$post = new MyExtendedClass1(); // Is extended by MyExtension 
someFunction($post); 

$post = new MyExtendedClass2(); // Is extended by MyExtension 
someFunction($post); 

Что мне интересно:

Есть ли способ, чтобы «добавить тип к объекту»? Есть ли способ, которым я могу обмануть проверку типов, чтобы разрешить эти вызовы.

+0

Это еще не работает на вас? [Это уже поддерживается поведение] (http://codepad.org/05MBHxCl) – castis

+0

Вы можете использовать как тип подсказки 'MyExtendedClass', так как все классы' MyExtension' будут расширять 'MyExtendedClass'. Или, что лучше, вы можете создать интерфейс, который должен реализовывать все классы расширения и использовать этот интерфейс для подсказки типа. – akDeveloper

+0

В PHP это называется ** Type Hinting **. Более подробную информацию можно найти на веб-сайте PHP: [Тип объявления] (http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration) – icecub

ответ

0

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

Если вам нужно some_function работать на различных типах он не может использовать их непосредственно и тип подсказка не может определить конкретный тип - использовать интерфейс.

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

interface MyExtensionInteface { 
    public function doSoemthingSpecial(); 
} 

function some_function(MyExtensionInterface $myExtension) { 
    $myExtension->doSomethingSpecial(); 
} 

class MyExtensionOfExtendedClass1 implements MyExtensionInteface 
{ 
    public function __construct(MyExtendedClass1 $obj) { 
     $this->extended = $obj; 
    } 

    public function doSomethingSpecial() { 
     //...with MyExtendedClass1 type 
    } 
} 

class MyExtensionOfExtendedClass2 impements MyExtensionInterface 
{ 
    public function __construct(MyExtendedClass2 $obj) { 
     $this->extended = $obj 
    } 

    public function doSomethingSpecial() { 
     //...with MyExtendedClass2 type 
    } 
} 

$a = new MyExtensionOfExtendedClass1(new MyExtendedClass1()); 
some_function($a); 

$b = new MyExtensionOfExtendedClass2(new MyExtendedClass2()); 
some_function($b); 

Именование «Расширение» предназначено только для контекста вопроса - оно должно иметь реальное значение объекта. Например: DuckSoup(Duck) + ChickenSoup(Chicken) + function:cook(Soup)

Смежные вопросы