РНР 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>"; ?> |
|
|
В начало ←предыдущая следующая→ ... 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 ... | |