Php создание класса по имени

Как создать объект по имени класса в PHP

Как создать объект по имени класса в PHP

В редких случаях бывает нужно создавать объект по имени класса в PHP. Используется это нечасто, но когда это требуется, то данная возможность отлично сказывается и на производительности, и на количестве кода. Давайте с Вами разберём, как создать объект по имени класса, и я покажу пример, где я лично отлично сэкономил, используя данную возможность в PHP.

Для начала сразу привожу код:

После его выполнения будет создан объект класса Point. Казалось бы, зачем это нужно? Привожу кусок кода из личной практики (он сильно упрощён, но самую суть я оставил):

$view = $_GET[«view»];
switch ($view) case «pagea»:
$content = new PageAContent($db);
break;
case «pageb»:
$content = new PageBContent($db);
break;
case «pagec»:
$content = new PageCContent($db);
break;
// Далее ещё пару десятков подобного дублирования
?>

А вот теперь посмотрите, как я сократил код с использованием возможности создания объекта по имени класса в PHP:

$class = $_GET[«view»].»Content»;
$content = new $class();
?>

Более того, при добавлении новой ключевой страницы на сайт мне не надо снова лезть в этот файл и добавлять 101-й блок.

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

Создано 26.12.2012 19:52:10

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 5 ):

    Круто! Спасибо. Только вот у вас опечатка в этом предложении «и я покажу пример, где я лично отлично сэкономил, используя данную возможностьв в PHP.» В слове возможность буква «В» в конце лишняя

    На форум http://myrusakov.ru/forum.html?act=thread&id=968, выложил комент, из за того что код сюда вставлять нельзя

    Михаил, огромное вам спасибо! Уже не первая отличная статья! Теперь будем знать как сократить код обработчика контента 🙂

    Доброго времени суток! хотелось бы узнать как сделать упражнение из урока «От нуля до Гуру/ООП в РНР/Статистическме свойства и методы «. Методы написал, а со всем остальным у меня проблема! Прошу Вас помочь! Заранее спасибо!

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Основы

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

    Именем класса может быть любое слово, при условии, что оно не входит в список зарезервированных слов PHP, начинается с буквы или символа подчеркивания и за которым следует любое количество букв, цифр или символов подчеркивания. Если задать эти правила в виде регулярного выражения, то получится следующее выражение: ^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$.

    Класс может содержать собственные константы, переменные (называемые свойствами) и функции (называемые методами).

    Пример #1 Простое определение класса

    class SimpleClass
    // объявление свойства
    public $var = ‘значение по умолчанию’ ;

    // объявление метода
    public function displayVar () echo $this -> var ;
    >
    >
    ?>

    Псевдо-переменная $this доступна в том случае, если метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта. Это показано на следующих примерах:

    Пример #2 Переменная $this

    class A
    function foo ()
    if (isset( $this )) echo ‘$this определена (‘ ;
    echo get_class ( $this );
    echo «)\n» ;
    > else echo «\$this не определена.\n» ;
    >
    >
    >

    class B
    function bar ()
    // Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
    A :: foo ();
    >
    >

    // Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
    A :: foo ();
    $b = new B ();
    $b -> bar ();

    // Замечание: следующая строка вызовет предупреждение, если включен параметр E_STRICT.
    B :: bar ();
    ?>

    Результат выполнения данного примера:

    $this определена (A) $this не определена. $this определена (B) $this не определена.

    new

    Для создания экземпляра класса используется директива new. Новый объект всегда будет создан, за исключением случаев, когда он содержит конструктор, в котором определен вызов исключения в случае ошибки. Рекомендуется определять классы до создания их экземпляров (в некоторых случаях это обязательно).

    Если с директивой new используется строка ( string ), содержащая имя класса, то будет создан новый экземпляр этого класса. Если имя находится в пространстве имен, то оно должно быть задано полностью.

    Пример #3 Создание экземпляра класса

    // Это же можно сделать с помощью переменной:
    $className = ‘Foo’ ;
    $instance = new $className (); // Foo()
    ?>

    В контексте класса можно создать новый объект через new self и new parent.

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

    Пример #4 Присваивание объекта

    $instance = new SimpleClass ();

    $assigned = $instance ;
    $reference =& $instance ;

    $instance -> var = ‘$assigned будет иметь это значение’ ;

    $instance = null ; // $instance и $reference становятся null

    var_dump ( $instance );
    var_dump ( $reference );
    var_dump ( $assigned );
    ?>

    Результат выполнения данного примера:

    NULL NULL object(SimpleClass)#1 (1) < ["var"]=>string(30) "$assigned будет иметь это значение" >

    В PHP 5.3.0 введены несколько новых методов создания экземпляров объекта:

    Пример #5 Создание новых объектов

    class Test
    static public function getNew ()
    return new static;
    >
    >

    $obj1 = new Test ();
    $obj2 = new $obj1 ;
    var_dump ( $obj1 !== $obj2 );

    $obj3 = Test :: getNew ();
    var_dump ( $obj3 instanceof Test );

    $obj4 = Child :: getNew ();
    var_dump ( $obj4 instanceof Child );
    ?>

    Результат выполнения данного примера:

    bool(true) bool(true) bool(true)

    extends

    Класс может наследовать методы и свойства другого класса используя ключевое слово extends при его описании. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.

    Наследуемые методы и свойства могут быть переопределены (за исключением случаев, когда метод класса объявлен как final) путем объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределенным методам или статическим методам путем обращения к ним через parent::

    Когда переопределяются методы число и типы аргументов должны оставаться такими же как и были, иначе PHP вызовет ошибку уровня E_STRICT . Это не относится к конструктору, который можно переопределить с другими параметрами.

    Пример #6 Простое наследование классов

    class ExtendClass extends SimpleClass
    // Переопределение метода родителя
    function displayVar ()
    echo «Расширенный класс\n» ;
    parent :: displayVar ();
    >
    >

    $extended = new ExtendClass ();
    $extended -> displayVar ();
    ?>

    Результат выполнения данного примера:

    Расширенный класс значение по умолчанию

    ::class

    Начиная с версии PHP 5.5 можно использовать ключевое слово class для разрешения имени класса. С помощью конструкции ClassName::class можно получить строку с абсолютным именем класса ClassName. Обычно это довольно полезно при работе с классами, использующими пространства имен.

    Пример #7 Разрешение имени класса

    Результат выполнения данного примера:

    Источник

    Читайте также:  Css placeholder vertical align
    Оцените статью