«магический метод __class» (передача ссылок на имена классов с помощью специального кода) - PullRequest
2 голосов
/ 12 ноября 2010

Вы можете перенаправить вызовы некоторых свойств / функций с помощью __get, __call.

Есть ли способ сделать это для классов?

Я хотел бы преобразовать все упоминания some_class_name в коде в MY_VERSION_some_class_name (не только для одного класса, это шаблон).

Это было бы легко, если бы методы / свойства были целью этой политики переименования.

Можете ли вы придумать способ сделать это для классов в PHP?

Редактировать: мне это нужно для ссылки на разные варианты классов в разных ситуациях. Мне нужно, чтобы одно имя класса было разрешено для разных вариантов этого класса, в зависимости от условия, известного во время выполнения и сохраняющегося в течение всего сеанса.

Спасибо

p.s. Если вам интересно, почему я хочу это сделать, посмотрите на Ведение вариантов приложения

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

Вы не можете преобразовать все упоминания some_class_name в коде в другой класс. Однако вы можете использовать переменные в качестве имен классов:

$className = "MyClass";
$obj = new $className;
$className::myMethod();

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

$factory = System::getFactory();
$obj = $factory->getAuthObj();

По сути, класс System возвращает другой объект в зависимости от того, какой класс необходимо использовать для этого конкретного времени выполнения.

1 голос
/ 12 ноября 2010

Неопробованный подход Эйдена: переменные переменные и генерация строки:

<?php
$dog = "12";

function getDogClass($myNum)
{
    global $dog;
    // Do something dynamic here;
    $dog = "Dog_" . $myNum;
    return "dog";
}

class Dog_13rc1
{
    function __construct()
    {
        printf("Woof!");
    }
}

class Dog_12
{
    function __construct()
    {
        printf("Grrrr");
    }
}

$myObj = new ${getDogClass('13rc1')}();
?>

Пока вызов getDogClass() возвращает строку имени переменной в области видимости, тогда вы в порядке.

Вывод woof.

Это означает, что единственный необходимый вам рефакторинг - это найти / заменить вхождения имени класса этим вызовом.

Но это мрачно. и, вероятно, медленно. Кроме того, хакерский тип обслуживания / отслеживания ошибок.

0 голосов
/ 12 ноября 2010

Волшебная функция, которую вы хотите: __autoload:

function __autoload($class_name) {
    // include your special class in here
    include $class_name . '.php'; 
}

Подробнее здесь: http://php.net/manual/en/language.oop5.autoload.php

...