了解类

class_exists验证类是否存在

<?php
// TaskRunner.php $classname = "Task";
$path = "tasks/{$classname}.php";
if ( ! file_exists( $path ) ) {
throw new Exception( "No such file as {$path}" ); //抛出异常,类文件不存在
}
require_once( $path );
$qclassname = "tasks\\$classname";
if ( ! class_exists( $qclassname ) ) {
throw new Exception( "No such class as $qclassname" ); //抛出异常,类不存在Fatal error: Uncaught exception 'Exception' with message 'No such class as tasks\Task'
Stack trace:
#0 {main}
}
$myObj = new $qclassname();
$myObj->doSpeak(); ?>

get_class 检查对象的类 instanceof 验证对象是否属于某个类

<?php
class CdProduct {} function getProduct() {
return new CdProduct( "Exile on Coldharbour Lane",
"The", "Alabama 3", 10.99, 60.33 ); // 返回一个类对象
} $product = getProduct();
if ( get_class( $product ) == 'CdProduct' ) {
print "\$product is a CdProduct object\n";
} ?> <?php
class CdProduct {} function getProduct() {
return new CdProduct( "Exile on Coldharbour Lane",
"The", "Alabama 3", 10.99, 60.33 );
} $product = getProduct();
if ( $product instanceof CdProduct ) {
print "\$product is a CdProduct object\n";
}
?>

get_class_methods 得到类中所有的方法列表,只获取public的方法,protected,private的方法获取不到。默认的就是public。

<?php

class CdProduct {
function __construct() { }
function getPlayLength() { }
function getSummaryLine() { }
function getProducerFirstName() { }
function getProducerMainName() { }
function setDiscount() { }
function getDiscount() { }
function getTitle() { }
function getPrice() { }
function getProducer() { }
} print_r( get_class_methods( 'CdProduct' ) ); ?>
output:
Array
(
[0] => __construct
[1] => getPlayLength
[2] => getSummaryLine
[3] => getProducerFirstName
[4] => getProducerMainName
[5] => setDiscount
[6] => getDiscount
[7] => getTitle
[8] => getPrice
[9] => getProducer
)

更多验证

<?php
class ShopProduct {}
interface incidental {}; class CdProduct extends ShopProduct implements incidental {
public $coverUrl;
function __construct() { }
function getPlayLength() { }
function getSummaryLine() { }
function getProducerFirstName() { }
function getProducerMainName() { }
function setDiscount() { }
function getDiscount() { }
function getTitle() { return "title\n"; }
function getPrice() { }
function getProducer() { }
} function getProduct() {
return new CdProduct();
} $product = getProduct(); // acquire an object
$method = "getTitle"; // define a method name
print $product->$method(); // invoke the method
if ( in_array( $method, get_class_methods( $product ) ) ) {
print $product->$method(); // invoke the method
}
if ( is_callable( array( $product, $method) ) ) {
print $product->$method(); // invoke the method
}
if ( method_exists( $product, $method ) ) {
print $product->$method(); // invoke the method
}
print_r( get_class_vars( 'CdProduct' ) ); if ( is_subclass_of( $product, 'ShopProduct' ) ) {
print "CdProduct is a subclass of ShopProduct\n";
} if ( is_subclass_of( $product, 'incidental' ) ) {
print "CdProduct is a subclass of incidental\n";
} if ( in_array( 'incidental', class_implements( $product )) ) {
print "CdProduct is an interface of incidental\n";
} ?>
output:
title
title
title
title
Array
(
[coverUrl] =>
)
CdProduct is a subclass of ShopProduct
CdProduct is a subclass of incidental
CdProduct is an interface of incidental

__call方法

<?php

class OtherShop {
function thing() {
print "thing\n";
}
function andAnotherthing() {
print "another thing\n";
}
} class Delegator {
private $thirdpartyShop;
function __construct() {
$this->thirdpartyShop = new OtherShop();
} function __call( $method, $args ) { // 当调用未命名方法时执行call方法
if ( method_exists( $this->thirdpartyShop, $method ) ) {
return $this->thirdpartyShop->$method( );
}
}
} $d = new Delegator();
$d->thing(); ?>
output:
thing

传参使用

<?php

class OtherShop {
function thing() {
print "thing\n";
}
function andAnotherthing( $a, $b ) {
print "another thing ($a, $b)\n";
}
} class Delegator {
private $thirdpartyShop;
function __construct() {
$this->thirdpartyShop = new OtherShop();
} function __call( $method, $args ) {
if ( method_exists( $this->thirdpartyShop, $method ) ) {
return call_user_func_array(
array( $this->thirdpartyShop,
$method ), $args );
}
}
} $d = new Delegator();
$d->andAnotherThing( "hi", "hello" ); ?>
output:
another thing (hi, hello)

反射API

fullshop.php
<?php
class ShopProduct {
private $title;
private $producerMainName;
private $producerFirstName;
protected $price;
private $discount = 0; public function __construct( $title, $firstName,
$mainName, $price ) {
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
} public function getProducerFirstName() {
return $this->producerFirstName;
} public function getProducerMainName() {
return $this->producerMainName;
} public function setDiscount( $num ) {
$this->discount=$num;
} public function getDiscount() {
return $this->discount;
} public function getTitle() {
return $this->title;
} public function getPrice() {
return ($this->price - $this->discount);
} public function getProducer() {
return "{$this->producerFirstName}".
" {$this->producerMainName}";
} public function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, ";
$base .= "{$this->producerFirstName} )";
return $base;
}
} class CdProduct extends ShopProduct {
private $playLength = 0; public function __construct( $title, $firstName,
$mainName, $price, $playLength=78 ) {
parent::__construct( $title, $firstName,
$mainName, $price );
$this->playLength = $playLength;
} public function getPlayLength() {
return $this->playLength;
} public function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": playing time - {$this->playLength}";
return $base;
} } class BookProduct extends ShopProduct {
private $numPages = 0; public function __construct( $title, $firstName,
$mainName, $price, $numPages ) {
parent::__construct( $title, $firstName,
$mainName, $price );
$this->numPages = $numPages;
} public function getNumberOfPages() {
return $this->numPages;
} public function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": page count - {$this->numPages}";
return $base;
} public function getPrice() {
return $this->price;
}
} /*
$product1 = new CdProduct("cd1", "bob", "bobbleson", 4, 50 );
print $product1->getSummaryLine()."\n";
$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );
print $product2->getSummaryLine()."\n";
*/
?> <?php
require_once "fullshop.php";
$prod_class = new ReflectionClass( 'CdProduct' );
Reflection::export( $prod_class );
?> output:
Class [ <user> class CdProduct extends ShopProduct ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 53-73 - Constants [0] {
} - Static properties [0] {
} - Static methods [0] {
} - Properties [2] {
Property [ <default> private $playLength ]
Property [ <default> protected $price ]
} - Methods [10] {
Method [ <user, overwrites ShopProduct, ctor> public method __construct ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 56 - 61 - Parameters [5] {
Parameter #0 [ <required> $title ]
Parameter #1 [ <required> $firstName ]
Parameter #2 [ <required> $mainName ]
Parameter #3 [ <required> $price ]
Parameter #4 [ <optional> $playLength = 78 ]
}
} Method [ <user> public method getPlayLength ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 63 - 65
} Method [ <user, overwrites ShopProduct, prototype ShopProduct> public method getSummaryLine ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 67 - 71
} Method [ <user, inherits ShopProduct> public method getProducerFirstName ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 17 - 19
} Method [ <user, inherits ShopProduct> public method getProducerMainName ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 21 - 23
} Method [ <user, inherits ShopProduct> public method setDiscount ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 25 - 27 - Parameters [1] {
Parameter #0 [ <required> $num ]
}
} Method [ <user, inherits ShopProduct> public method getDiscount ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 29 - 31
} Method [ <user, inherits ShopProduct> public method getTitle ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 33 - 35
} Method [ <user, inherits ShopProduct> public method getPrice ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 37 - 39
} Method [ <user, inherits ShopProduct> public method getProducer ] {
@@ D:\xampp\htdocs\popp-code\5\fullshop.php 41 - 44
}
}
}

点评:把类看的透彻的一塌糊涂,比var_dump强多了。哪些属性,继承了什么类。类中的方法哪些是自己的,哪些是重写的,哪些是继承的,一目了然。

查看类数据

<?php
require_once("fullshop.php"); function classData( ReflectionClass $class ) {
$details = "";
$name = $class->getName();
if ( $class->isUserDefined() ) {
$details .= "$name is user defined\n";
}
if ( $class->isInternal() ) {
$details .= "$name is built-in\n";
}
if ( $class->isInterface() ) {
$details .= "$name is interface\n";
}
if ( $class->isAbstract() ) {
$details .= "$name is an abstract class\n";
}
if ( $class->isFinal() ) {
$details .= "$name is a final class\n";
}
if ( $class->isInstantiable() ) {
$details .= "$name can be instantiated\n";
} else {
$details .= "$name can not be instantiated\n";
}
return $details;
} $prod_class = new ReflectionClass( 'CdProduct' );
print classData( $prod_class ); ?>
output:
CdProduct is user defined
CdProduct can be instantiated

查看方法数据

<?php
require_once "fullshop.php";
$prod_class = new ReflectionClass( 'CdProduct' );
$methods = $prod_class->getMethods(); foreach ( $methods as $method ) {
print methodData( $method );
print "\n----\n";
} function methodData( ReflectionMethod $method ) {
$details = "";
$name = $method->getName();
if ( $method->isUserDefined() ) {
$details .= "$name is user defined\n";
}
if ( $method->isInternal() ) {
$details .= "$name is built-in\n";
}
if ( $method->isAbstract() ) {
$details .= "$name is abstract\n";
}
if ( $method->isPublic() ) {
$details .= "$name is public\n";
}
if ( $method->isProtected() ) {
$details .= "$name is protected\n";
}
if ( $method->isPrivate() ) {
$details .= "$name is private\n";
}
if ( $method->isStatic() ) {
$details .= "$name is static\n";
}
if ( $method->isFinal() ) {
$details .= "$name is final\n";
}
if ( $method->isConstructor() ) {
$details .= "$name is the constructor\n";
}
if ( $method->returnsReference() ) {
$details .= "$name returns a reference (as opposed to a value)\n";
}
return $details;
} ?>
output:
__construct is user defined
__construct is public
__construct is the constructor ----
getPlayLength is user defined
getPlayLength is public ----
getSummaryLine is user defined
getSummaryLine is public ----
getProducerFirstName is user defined
getProducerFirstName is public ----
getProducerMainName is user defined
getProducerMainName is public ----
setDiscount is user defined
setDiscount is public ----
getDiscount is user defined
getDiscount is public ----
getTitle is user defined
getTitle is public ----
getPrice is user defined
getPrice is public ----
getProducer is user defined
getProducer is public

获取构造函数参数情况

<?php
require_once "fullshop.php"; $prod_class = new ReflectionClass( 'CdProduct' );
$method = $prod_class->getMethod( "__construct" );
$params = $method->getParameters(); foreach ( $params as $param ) {
print argData( $param )."\n";
} function argData( ReflectionParameter $arg ) {
$details = "";
$declaringclass = $arg->getDeclaringClass();
$name = $arg->getName();
$class = $arg->getClass();
$position = $arg->getPosition();
$details .= "\$$name has position $position\n";
if ( ! empty( $class ) ) {
$classname = $class->getName();
$details .= "\$$name must be a $classname object\n";
} if ( $arg->isPassedByReference() ) {
$details .= "\$$name is passed by reference\n";
} if ( $arg->isDefaultValueAvailable() ) {
$def = $arg->getDefaultValue();
$details .= "\$$name has default: $def\n";
} if ( $arg->allowsNull() ) {
$details .= "\$$name can be null\n";
} return $details;
}
?> output:
$title has position 0
$title can be null $firstName has position 1
$firstName can be null $mainName has position 2
$mainName can be null $price has position 3
$price can be null $playLength has position 4
$playLength has default: 78
$playLength can be null

PHP面向对象深入研究之【了解类】与【反射API】的更多相关文章

  1. 利用反射api查找一个类的具体信息

    讲到这个实例,首先介绍下本人,我是一个php程序猿.从事drupal开发2年多.能够说从实习開始就接触这个,至今没有换过.drupal给我的感觉是俩字"强大",今天写一个views ...

  2. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  3. Java-WebSocket 项目的研究(三) WebSocketClient 类 具体解释

    通过之前两篇文章 Java-WebSocket 项目的研究(一) Java-WebSocket类图描写叙述 Java-WebSocket 项目的研究(二) 小试身手:client连接server并发送 ...

  4. Python面向对象篇(1)-类和对象

    面向对象编程 1.编程范式   我们写代码的目的是什么?就是为了能够让计算机识别我们所写的代码并完成我们的需求,规范点说,就是通过编程,用特定的语法+数据结构+特殊算法来让计算机执行特定的功能,实现一 ...

  5. 面向对象:MATLAB的自定义类 [MATLAB]

    https://www.cnblogs.com/gentle-min-601/p/9785812.html 面向对象:MATLAB的自定义类 [MATLAB]   这几天刚刚开始学习MATLAB的面向 ...

  6. 设计模式学习(二):面向对象设计原则与UML类图

    一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...

  7. JavaScript面向对象编程(2)-- 类的定义

    最近这一段时间事情太多了,没有时间再继续写,幸好这两天有点小闲,先小写一下JavaScript中面向对象一中推荐的方法.本文承接上一篇JavaScript面向对象编程(1) -- 基础. 上篇说过,J ...

  8. 01 语言基础+高级:1-2 面向对象和封装_day06【类与对象、封装、构造方法】

    day06[类与对象.封装.构造方法] 面向对象类与对象三大特征——封装构造方法 能够理解面向对象的思想能够明确类与对象关系能够掌握类的定义格式能够掌握创建对象格式,并访问类中的成员能够完成手机类的练 ...

  9. java 面向对象(一):类与对象

    1.面向对象学习的三条主线: * 1.Java类及类的成员:属性.方法.构造器:代码块.内部类 * * 2.面向对象的大特征:封装性.继承性.多态性.(抽象性) * * 3.其它关键字:this.su ...

随机推荐

  1. 四 web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签

    标签选择器对象 HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象需要导入模块:from scrapy.selector import HtmlXPa ...

  2. 亲测安装nginx1.8.1 日期2016年3月16日

    1.安装nginx tar zxvf nginx-1.8.1.tar.gz cd nginx-1.8.1 ./configure make make install /usr/local/nginx/ ...

  3. Flask 分页的简单用法 / flask_sqlalchemy /无刷新翻转页面(原创)

    flask_sqlalchemy对象提供分页方法 1. 后台views代码: from models import <table_name> #导入model的对象 @app.route( ...

  4. 简单使用JDOM解析XML

    原文:http://liuwentao.iteye.com/blog/59978 使用JDOM解析XML一.前言JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创 ...

  5. UICollectionView-网格视图

    1. UICollectionView 网格视图,除了提供与UITableView同样的功能显示一组顺序显示的数据,还支持多列的布局. 2. UICollectionView 使用 > 设置Co ...

  6. request对象和response对象,什么时候用,具体用哪一个,没有感觉

    request对象和response对象,什么时候用,具体用哪一个,没有感觉

  7. 2017.11.18 IAP下载(STM8,PIC,STM32)

    客户要求用IAP下载,mark一下,客户还给了stm32的引导码.仅供参考. 1 PIC单片机的IAP  2 STm32 IAP https://www.cnblogs.com/WeyneChen/p ...

  8. Activity Process Task Application 专题讲解

    Activity Process Task Application 专题讲解 Activity.和进程 为了阅读方便,将文档转成pdf http://files.cnblogs.com/franksu ...

  9. poscms仿站知识点总结(二)

    1.相同类型div添加不同class 遇到一个样式上的问题,模板页面有8个子项,样式都是一样,至于数据是可以用for循环来添加的,但是for循环的时候,每个div的 类名是无法及时更改的,但是模板页面 ...

  10. Android面试题整理

    1.    请描述下Activity的生命周期. 2.    如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态? 3.    如何将一个Activity设置成窗口的样 ...