Создать объект своего класса.

nerezus

Вселенский отказник
Создать объект своего класса.

Как создать объект своего класса из статического метода предка?

PHP:
class A {
    static function bebebe() {
        return o_O; // < = как создать объект класса B тут?
    }
}

class B extends A {}

B::bebebe();
Я смотрел и рефлексию, и get_class - не подходят походу...
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
<?php
class A {
    static function bebebe() {
        $class = __CLASS__;
        return new $class;
    } 
} 

class B extends A {} 

$b = B::bebebe();

var_dump($b);
?>
А теперь, обьясни — нафига???
 

nerezus

Вселенский отказник
> А теперь, обьясни — нафига???
в статик методе создать массив объектов данного типа и вернуть их.

> __CLASS__;
вернет A, а не B.

> return new self();
вернет A, а не B.
 

whirlwind

TDD infected, paranoid
скока раз уже писать - забыли про наследование раз и навсегда, если статик. Статика != ООП.
 

nerezus

Вселенский отказник
А есть какой-либо грязный хак, который поможет сымитировать позднее статическое связывание?

Просто функции класса-предка хотели бы работать с данными наследников...

-~{}~ 29.10.08 23:12:

Переписал без static.

Жаль, что нельзя писать (new SomeClass())->someMethod()
Кстати в других ЯП такое работает.
 

Beavis

Banned
nerezus
Одну строчку лишнюю жалко? Хотя небось рядом куча пустых строк...
 

nerezus

Вселенский отказник
> Одну строчку лишнюю жалко?
да, т.к. не несет смысла, а только засоряет код.

а пустые строки несут - служат разделителями - помогают читать код.
 

fixxxer

К.О.
Партнер клуба
>>А есть какой-либо грязный хак, который поможет сымитировать позднее статическое связывание?

очень грязный

пропарсить debug backtrace =)
 

HraKK

Мудак
Команда форума
старая как мир, я думаю можно интереснее придумать.
 

zerkms

TDD infected
Команда форума
кстати, цели так и не озвучены, зачем этим заниматься вообще
 

nerezus

Вселенский отказник
да свой ORM написал легкий)
для выбора объектов по критерию хотел сделать через статик-метод.
 

master_x

Pitavale XXI wieku
nerezus
если ты про ActiveRecord (мож я не так понял), можно класс динамически создавать... но это тож хак.
Т.е. вот это
Articles::find(1);
Будет работать без static-binding и без сущестующего класса Articles.
А вообще никакого LSB не должно быть. Это противоречит ООП.
 

AmdY

Пью пиво
Команда форума
Articles::find(1);
Будет работать без static-binding и без сущестующего класса Articles.
где-то я это уже видел и знаю как реализовать подобие сего грязного хака
 

nerezus

Вселенский отказник
Я сделал через фабрику в лоадере моделей получение.

Примерно так )
$users = ORM::load('Users')->getAll();
 
Сверху