了内省一个属性,你必须首先创建ReflectionProperty类的一个实例,你可以随后访问这个实例的任何上述方法。
例子 19-37. Using the ReflectionProperty class复制PHP内容到剪贴板PHP代码:
<?php
class String
{ public $length = 5; }
// Create an instance of the ReflectionProperty class
$prop=new ReflectionProperty('String','length');
// Print out basic information
printf( "===> The%s%s%s%s property '%s' (which was %s)\n" .
" having the modifiers %s\n",
$prop->isPublic() ? ' public' : '',
$prop->isPrivate() ? ' private' : '',
$prop->isProtected() ? ' protected' : '',
$prop->isStatic() ? ' static' : '',
$prop->getName(),
$prop->isDefault() ? 'declared at compile-time' : 'created at run-time',
var_export(Reflection::getModifierNames($prop->getModifiers()),1)
);
$obj= new String();//Create an instance of String
printf("--->Value is: ");//Get current value
var_dump($prop->getValue($obj));
$prop->setValue($obj,10); // Change value
printf("---> Setting value to 10, new value is: ");
var_dump($prop->getValue($obj));
var_dump($obj); //Dump object
?>
注:试图获得或设置私有的或保护的类属性的值将导致一个被抛出的异常。
映射扩展(ReflectionExtension)
ReflectionExtension类允许你反向设计扩展。你可以在使用get_loaded_extensions()运行的时候重新返回所有加载的扩展。复制PHP内容到剪贴板PHP代码:
<?php
class ReflectionExtension implements Reflector
{ final private __clone()
public __construct(string name)
public string __toString()
public static string export()
public string getName()
public string getVersion()
public ReflectionFunction[] getFunctions()
public array getConstants()
public array getINIEntries()
public ReflectionClass[] getClasses()
public array getClassNames()
}
?>
为了内省一个扩展,你必须首先创建ReflectionExtension类的一个实例。你可以随后访问这个实例的任何上述方法。
例子 19-38. 使用ReflectionExtension 的类复制PHP内容到剪贴板PHP代码:
<?php
// Create an instance of the ReflectionProperty class
$ext=new ReflectionExtension('standard');
// Print out basic information
printf("Name : %s\n" .
"Version : %s\n" .
"Functions : [%d] %s\n" .
"Constants : [%d] %s\n" .
"INI entries : [%d] %s\n" .
"Classes : [%d] %s\n",
$ext->getName(),
$ext->getVersion()?$ext->getVersion():'NO_VERSION',
sizeof($ext->getFunctions()),
var_export($ext->getFunctions(),1),
sizeof($ext->getConstants()),
var_export($ext->getConstants(),1),
sizeof($ext->getINIEntries()),
var_export($ext->getINIEntries(),1),
sizeof($ext->getClassNames()),
var_export($ext->getClassNames(),1)
);
?>
扩展中的映射类(Extending the reflection classes)
万一你想创建一个构建类的专用的形式(就是说:在输出时创建彩色的HTML,拥有易访问的成员变量来代替方法或拥有公共方法),你可以继续和扩展它们。
例子 19-39. Extending the built-in classes复制PHP内容到剪贴板PHP代码:
<?php
/** My Reflection_Method class */
class My_Reflection_Method extends ReflectionMethod
{ public $visibility = '';
public function __construct($o, $m)
{ parent::__construct($o, $m);
$this->visibility= Reflection::getModifierNames($this->getModifiers());
}
}
class T { protected function x() { } } //Demo class #1
class U extends T { function x() { } } //Demo class #2
var_dump(new My_Reflection_Method('U','x'));//Print out information
?>
注意警告:如果你重写构造函数,请记住在你插入任何代码之前通知父类的构造函数。不这样做将导致以下:致命错误: 内部错误:返回映射对象失败。
第19章 类与对象(PHP5)之十五:典型提示(线索)Type Hinting
PHP5引入了类型提示。函数现在能给对象强制参数(在函数原型中通过指定类的名字)或数组(从PHP 5.1开始) 。
例子 19-40. Type Hinting examples复制PHP内容到剪贴板PHP代码:
<?php
class MyClass // An example class
{/**A test function
* First parameter must be an object of type OtherClass */
public function test(OtherClass $otherclass) { echo $otherclass->var; }
/*Another test function * First parameter must be an array*/
public function test_array(array $input_array){ print_r($input_array); }
}
class OtherClass{ public $var='Hello World'; }//Another example class
?>
Failing to satisfy the type hint results in a fatal error.复制PHP内容到剪贴板PHP代码:
<?php
// An instance of each class
$myclass = new MyClass;
$otherclass = new OtherClass;
// Fatal Error: Argument 1 must be an object of class OtherClass
$myclass->test('hello');
// Fatal Error: Argument 1 must be an instance of OtherClass
$foo = new stdClass;
$myclass->test($foo);
$myclass->test(null); //Fatal Error: Argument 1 must not be null
$myclass->test($otherclass); //Works: Prints Hello World
$myclass->test_array('a string');//Fatal Error:Argument 1 must be an array
$myclass->test_array(array('a', 'b', 'c'));//Works: Prints the array
?>
Type hinting also works with functions:
类型提示也可以与函数协同工作。复制PHP内容到剪贴板PHP代码:
<?php
class MyClass { public $var = 'Hello World'; }//An example class
/**A test function * First parameter must be an object of type MyClass */
function MyFunction(MyClass $foo){ echo $foo->var; }
$myclass = new MyClass; //Works
MyFunction($myclass);
?>
类型提示可以只是对象和数组(从PHP 5.1开始)类型。传统的类型提示不支持整型和字符串型。
在此我把“Type Hinting”翻译为“类型提示”不知道合适不合适?
请大家提出建议,谢谢!!
分享到:
相关推荐
### PHP5 类与对象知识点详解 #### 1. PHP 类与对象 在 PHP5 中,类是用于定义对象模板的一种语法结构。一个类可以包含属性(变量)和方法(函数)。对象则是根据类实例化的实体。 ```php class Person { public...
### PHP5类与对象编程详解 #### 一、引言 随着PHP5的发布,PHP引入了一种全新的对象模型(Object Model),这标志着PHP在面向对象编程(OOP)方面迈出了重要的一步。相比于早期版本,PHP5的对象处理方式更加高效且功能...
相较于 PHP4,PHP5 引入了许多新特性,包括真正的类和对象支持、命名空间、接口、抽象类等,这些都是构建大型应用的基础。 #### 三、类和对象的概念 - **类(Class)**:类是对一组具有相同特性和行为的对象的抽象...
面向对象的PHP操作MSSQL类是一个用于与微软SQL Server数据库进行交互的工具,它将传统的数据库连接和查询封装在类结构中,提高了代码的可读性和可维护性。在这个压缩包中,我们只有一个文件“面向对象的php操作mssql...
PHP面向对象 PHP类结构图 非常全面的类结构解析
在PHP5及以上版本中,对OOP的支持大大增强,使得开发者可以构建更加结构化和可维护的程序。 1. **类(Class)**:类是面向对象编程的基础,它是创建对象的蓝图或模板。在PHP中,你可以定义一个类,包含属性(成员...
在PHP5中,面向对象编程引入了许多高级特性,使得它能更好地支持面向对象的设计原则。本章主要讨论了三个核心的面向对象特性:静态变量和方法、final关键字以及abstract(抽象)类和方法。 首先,我们来探讨静态...
在PHP编程中,面向对象(Object-Oriented Programming, OOP)是一种强大的设计模式,它允许程序员通过类和对象来组织代码,实现更高效的代码复用和更好的结构化。本教程将深入探讨PHP中的面向对象特性,特别是类的...
在PHP编程中,面向对象(Object-Oriented Programming, OOP)是一种...这只是一个起点,PHP面向对象的世界远比这广阔,包括异常处理、访问控制、魔术方法、静态属性与方法、命名空间、Traits等更多概念等待我们去探索。
《深入PHP:面向对象、模式与实践》是一本专注于PHP编程技术的专业书籍,它涵盖了PHP开发中的核心概念、面向对象编程、设计模式以及最佳实践。这本书对于PHP开发者来说,是提升技能、深化理解的重要资源。 首先,让...
PHP5引入了完整的面向对象编程(OOP)支持,包括类定义、继承、封装、多态等特性。 - 类定义:使用`class`关键字,如`class MyClass {...}`。 - 对象创建:通过`new`关键字实例化对象,如`$obj = new MyClass();`。...
《深入PHP面向对象模式与实践第2版》是一本专注于PHP面向对象编程的书籍,它不仅涉及到面向对象编程的基础知识,还深入讲解了面向对象设计模式以及如何在实际项目中应用这些模式。该书是对PHP开发者掌握面向对象技术...
在PHP中,面向对象编程自PHP 5开始得到广泛应用,并在后续版本中不断改进。 #### 1. 什么是过程化 在讨论面向对象之前,我们需要先理解过程化的概念。过程化编程(Procedural Programming)是一种编程范式,它侧重...
在PHP5中,类与对象编程引入了丰富的特性,使得面向对象的编程更加灵活和强大。本篇主要讨论了范围解析操作符(::)、`self`和`parent`关键字、静态关键字以及类常量等核心概念。 首先,范围解析操作符(::)是PHP...
PHP作为一种动态类型的语言,自PHP5开始引入了完整的面向对象支持,使得开发者可以利用类和对象的概念来组织和管理代码。本文将深入探讨PHP中的类、对象以及构造方法。 首先,类(Class)是面向对象编程的基础,它...
本篇文章将深入探讨PHP的面向对象程序设计类,包括类的定义、实例化以及特殊方法`__set()`和`__get()`的使用。 1. **类的定义** 类是面向对象编程的基本单位,它封装了数据和操作这些数据的方法。在PHP中,我们...
本篇文章将详细探讨如何创建一个PHP面向对象的分页类,以及它的核心概念和实现方式。 首先,我们来理解面向对象的基本概念。在PHP中,面向对象包括类(Class)、对象(Object)、属性(Properties)和方法(Methods...
一、类与对象 类是创建对象的蓝图,它定义了对象的属性和行为。在PHP中,我们使用关键字"class"来声明一个类。例如: ```php class MyClass { public $property; function __construct() { // 构造函数 } ...
### PHP5中的类和对象详解 #### 面向对象编程概述 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和处理数据的方法捆绑在一起形成“对象”。这种编程方式旨在提高代码的复用性和...