PHP面向对象程序设计之类与反射API的示例分析
发表于:2024-12-01 作者:千家信息网编辑
千家信息网最后更新 2024年12月01日,这篇文章给大家分享的是有关PHP面向对象程序设计之类与反射API的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:了解类class_exists验证类是否存
千家信息网最后更新 2024年12月01日PHP面向对象程序设计之类与反射API的示例分析
这篇文章给大家分享的是有关PHP面向对象程序设计之类与反射API的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
具体如下:
了解类
class_exists验证类是否存在
doSpeak();?>
get_class 检查对象的类 instanceof 验证对象是否属于某个类
get_class_methods 得到类中所有的方法列表,只获取public的方法,protected,private的方法获取不到。默认的就是public。
output:
Array( [0] => __construct [1] => getPlayLength [2] => getSummaryLine [3] => getProducerFirstName [4] => getProducerMainName [5] => setDiscount [6] => getDiscount [7] => getTitle [8] => getPrice [9] => getProducer)
更多验证
$method(); // invoke the methodif ( 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:
titletitletitletitleArray( [coverUrl] =>)CdProduct is a subclass of ShopProductCdProduct is a subclass of incidentalCdProduct is an interface of incidental
__call方法
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
传参使用
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
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";*/?>
output:
Class [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 [ private $playLength ] Property [ protected $price ] } - Methods [10] { Method [ public method __construct ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 56 - 61 - Parameters [5] { Parameter #0 [ $title ] Parameter #1 [ $firstName ] Parameter #2 [ $mainName ] Parameter #3 [ $price ] Parameter #4 [ $playLength = 78 ] } } Method [ public method getPlayLength ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 63 - 65 } Method [ public method getSummaryLine ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 67 - 71 } Method [ public method getProducerFirstName ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 17 - 19 } Method [ public method getProducerMainName ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 21 - 23 } Method [ public method setDiscount ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 25 - 27 - Parameters [1] { Parameter #0 [ $num ] } } Method [ public method getDiscount ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 29 - 31 } Method [ public method getTitle ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 33 - 35 } Method [ public method getPrice ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 37 - 39 } Method [ public method getProducer ] { @@ D:\xampp\htdocs\popp-code\5\fullshop.php 41 - 44 } }}
点评:把类看的透彻的一塌糊涂,比var_dump强多了。哪些属性,继承了什么类。类中的方法哪些是自己的,哪些是重写的,哪些是继承的,一目了然。
查看类数据
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
查看方法数据
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 definedgetPlayLength is public----getSummaryLine is user definedgetSummaryLine is public----getProducerFirstName is user definedgetProducerFirstName is public----getProducerMainName is user definedgetProducerMainName is public----setDiscount is user definedsetDiscount is public----getDiscount is user definedgetDiscount is public----getTitle is user definedgetTitle is public----getPrice is user definedgetPrice is public----getProducer is user definedgetProducer is public
获取构造函数参数情况
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的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
方法
对象
反射
更多
验证
示例
程序
程序设计
分析
设计
内容
数据
篇文章
不错
实用
透彻
一塌糊涂
一目了然
函数
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
抽血进国家数据库能吃早饭吗
三级网络技术的视频课
数据库关闭找系统员联系怎么办
不能访问打印机服务器Win7
工业机器人计算机网络技术
大合网络技术怎么样
docket服务器管理
戴尔730服务器固件
工商银行软件开发中心职级
sql脚本还原数据库
微信小程序连接服务器
肇庆酒店软件开发市场价
网络安全大赛比赛场地
ctf网络安全大赛参赛条件
福建软件开发项目经理前景
社区网络安全隐患自查
计算机网络技术可以去当兵吗
贵广网络技术员工待遇
职高计算机网络技术学什么课程
网络安全采购预算上会材料
网络安全思政大讲堂观后感
桃花源记手游服务器
产业互联网东土科技
dt6.0 数据库修改
4台服务器集群搭建
dts数据库路径
软件开发自检报告
可以用来说网络技术的诗词
软件开发巅峰
福建农商银行网络安全