РНР 5 в подлиннике

Страница 356 из 554


Гпава 35. Отражения, итераторы, массивы

719

свойств класса, и значениями — их величинами. Точно так же работает и метод getDefauitProperties!), но только он возвращает массив со значениями свойств по умолчанию (напоминаем, что значения по умолчанию указываются при описании класса В виде: public Sproperty=defaultValue).

В итоге мы видим, ReflectionClass ссылается на два других, неизвестных нам отражения — ReflectionProperty И ReflectionMethod. Давайте рассмотрим ИХ последовательно.

Отражение ReflectionProperty соответствует отдельно взятому свойству некоторого класса. Рассмотрим его интерфейс:

class ReflectionProperty implements Reflector { public _construct(mixed Sclass, string Sname);

public int getModifiers(); // битовая маска модификаторов

public ReflectionClass getDeclaringClass(); // класс-владелец

public mixed getValue(Sobject);

public void setValue($object, mixed Svalue);

public string _toStringO; // отладочное представление

Как видите, ничего особенно сложного в этом описании нет. Остановимся на методах getvaiueo и setvalueо, которые позволяют неявно получать или, наоборот, устанавливать значения некоторых свойств объекта. Параметр $object как раз и указывает тот объект, в котором будут производиться изменения — ведь свойство не существует в классе само по себе, оно имеется только в объекте.

Это, конечно, не относится к статическим свойствам: последние хранятся как раз в классе, а не в объекте. К сожалению, в версии РНР 5.0 методы getvalueO и setvalue о не умели работать с такими свойствами.

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

class ReflectionMethod extends RefiectionFunction {

public _construct(mixed $class, string Sname);

public mixed invoke($object, ...);

public bool isFinalf); // метод нельзя переопределить?

public bool isAbstract(); // абстрактный метод?

Свойство класса: ReflectionProperty

public string getName (); public bool isPublicO; public bool isPrivatel); public bool isProtected() public bool isStaticO;

// возвращает имя свойства

// public-свойство?

// private?

// protected?

// статическая переменная класса?

Метод класса: ReflectionMethod

720

Часть V. Объектно-ориентированное программирование на РНР

public bool isPublicf); public bool isPrivate(); public bool isProtected(); public bool isStatic(); public bool isConstructor(), public bool isDestructor(); public int getModifiers();

// открытый? // закрытый? // защищенный? // статический? // а может, зто конструктор? // а может, и деструктор... // битовая маска модификаторов public Reflection_Class getDeclaringClass(); //'класс-владелец // Плюс методы, унаследованные от базового класса.

}

Особого внимания тут заслуживает, разве что, функция-член invoke о, которая позволяет неявно вызвать метод для указанного объекта Sobject. Она принимает переменное число параметров (по количесву аргументов вызываемого метода).

Библиотека расширения: ReflectionExtension

Последнее отражение, которое имеется в РНР, относится к поддержке библиотек расширения. Каждая такая библиотека может подключаться в файле php.ini директивой extension=Hzwr_paciraipeHHjj. Несколько расширений мы уже рассматривали в этой книге: например, PHP-интерфейсы библиотеки GD и СУБД MySQL. Класс-отражение ReflectionExtension позволяет получить в программе свойства того или иного расширения. Его интерфейс выглядит так:

class ReflectionExtension implements Reflector { public _construct(string name);

public string getName(); // имя библиотеки расширения public string getVersion(); // ее версия

public RefiectionFunction!] getF'unctions () ; // список функций public array getConstants(); // значения всех констант public array getlNIEntries(); // значения всех директив php.ini public string _toStringO; // отладочное представление

}

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

самостоятельно создать объекты ReflectionExtension.

Пример из листинга 35.9 выводит список всех констант, определяемых в подключенных расширениях РНР. С его помощью вы можете узнать, что, оказывается, в программе изначально доступно более 500 предопределенных констант!

! Листинг 35.9. Файл rext.php

<?php ## Использование отражения библиотеки. Sconsts = array();

foreach (get_loaded__extensions () as $name) { Sext = new ReflectionExtension(Sname); Sconsts = array__merge (Sconsts, $ext->getConstants () ) ;

)

echo "<pre>".var_export(Sconsts, true)."</pre>"; ?>



лучший контент игры телефон бесплатно наслаждайся

  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006