dynClass как лучший PHP stdClass - файл пакета dynClass онлайн урок.


Что такое stdClass?

PHP поддерживает объектно-ориентированное программирование много лет назад в PHP 3. Это означает, что вы можете создавать объекты классов, которые имеют общие переменные и функции.

stdClass - это общий класс, введенный в PHP 4 для создания общих объектов без каких-либо исходных переменных. Вы просто создаете объект класса и задаете свойства по требованию.

$ object = new stdClass
$ object- & gt; a = 1;
$ object- & gt; b = "a";

Почему stdClass недостаточно?

Я построил статический конвертер HTML-шаблона, который заменил токены на предварительно вычисленные значения. Предварительно вычисленные значения были переданы в объект stdClass, где ключи, представленные именами свойств, и значения были значениями замены для соответствующих токенов.

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

Введение в dynClass

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

Лямбда-функции выглядели как путь, но я обнаружил, что, хотя вы можете добавить лямбда-функцию в качестве свойства для объектов stdClass, они остаются свойствами, а не методами.

dynClass расширяет stdClass, так что лямбда-функции рассматриваются как методы класса. Они являются полноправными членами класса, что означает, что вы можете, например, ссылаться на $ this внутри них.

Теперь у меня есть фреймворк, который намного эффективнее и класс, который потенциально имеет и другие виды использования.

dynClass против stdClass

Лучше, чем рассказывать, показывает реальный пример использования os, сравнивающий то, что вы можете сделать с dynClass, а не с stdClass.

Инициализация классов

$ dyn = новый dynClass (массив ("z" = & gt; "foo", "method1" = & gt; function () {return "Method1 called";})); $ std = new stdClass (array ("z" = & gt; "foo"));

dynClass понимает инициализацию из массива...

echo "dyn - & gt; z:". $ Дин & GT; г;

... но stdClass этого не делает.

echo "std - & gt; z:". $ STD- & GT; г;
$ dyn- & gt; a = массив (1,2,3,4, "ttt"); $ std- & gt; a = массив (1,2,3,4, "ttt"); $ dyn- & gt; b = true; $ std- & gt; b = true; $ dyn- & gt; c = "string"; $ std- & gt; c = "string"; $ testclass = new stdClass (); $ testclass- & gt; свойство = "свойство теста"; $ dyn- & gt; o = $ testclass; $ std- & gt; o = $ testclass; $ dyn- & gt; f = function ($ parm = 'no value received') {return "lambda прошел $ parm";}; $ std- & gt; f = function ($ parm = 'no value прошло') {return "lambda прошел $ parm";}; $ u = function ($ parm = 'no value received') {return "Сохраненная лямбда вернула $ parm";}; $ dyn- & gt; u = $ u; $ std- & gt; u = $ u; $ t = function ($ parm = 'z') {return $ this- & gt; $ parm;}; $ dyn- & gt; t = $ t; глобальный $ glob; $ glob = «Это глобальный»; $ g = function () {global $ glob; return «Это извне: $ glob»;}; $ dyn- gt; g = $ g; $ std- & gt; g = $ g; $ dyn- & gt; i = 55; $ std- & gt; i = 55; $ dyn- & gt; e = 55E6; $ std- & gt; e = 55E6;

Var_dump из stdClass

var_dump ($ std);

Var_dump dynClass

var_dump ($ dyn);

Тест lambdas добавлен в dynClass в качестве свойств, непосредственно назначенных лямбда.

echo "f: {$ dyn- & gt; f} косвенно назначен lambda u: {$ dyn- & gt; u} lambda, ссылающийся на глобальный g: {$ dyn- & gt; g} lambda referencing \ $ this t: {$ dyn - & gt; t} lambda при методе создания экземпляра 1: {$ dyn- & gt; method1} ";

Тест lambdas добавлен в dynClass как методы, непосредственно назначенные lambda f.

echo "{$ dyn- & gt; f (" - value- ")} косвенно назначается lambda u: {$ dyn- & gt; u (" - value- ")} lambda, ссылающаяся на глобальную g: {$ dyn- & gt; g ("- value-")} lambda referencing \ $ this t: {$ dyn- & gt; t ("z")}

Остальные будут терпеть неудачу.

try {

Тест lambdas добавлен в stdClass как свойства.

echo "f: {$ std- & gt; f} u: {$ std- & gt; u} g: {$ std- & gt; g}";

Тест lambdas добавлен в stdClass как методы.

echo "f: {$ std- & gt; f (" - value- ")} u: {$ std- & gt; u (" - value- ")} g: {$ std- & gt; g (" - value- ")} & lt; pre & gt; ";} catch (Exception $ e) {

Как и ожидалось, эта ошибка произошла.

}