PHP面向对象程序设计之类与反射API的示例分析
发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,这篇文章给大家分享的是有关PHP面向对象程序设计之类与反射API的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:了解类class_exists验证类是否存
千家信息网最后更新 2025年02月22日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安全错误
数据库的锁怎样保障安全
政府部门整改网络安全的通知
合肥网时代软件开发公司
华为云文档数据库如何插入数据集
数据库使用外键约束老是报错
杭州银行软件开发岗笔试
戴尔服务器设置radio
腾讯云服务器安全组配置
iis mysql数据库
风行网络安全教育
语言服务器
金融互联网高科技赚钱
六安工程管理软件开发公司
为什么服务器能装那么多硬盘
网络安全期末大题
软件开发schedule
wincc 客户端服务器
安恒信息网络安全产品
安庆手机软件开发公司
长宁区企业网络技术服务口碑推荐
东营 软件开发
hp服务器安全模式进不了
银川网络安全资讯
想代理云服务器
考网络技术三级工作干什么
唯物辩证法思维导图软件开发
如何让自己的电脑变成远程服务器
软件开发员职业测评系统
宿州工程管理软件开发公司
云服务器 哪个好用
清除华为手机数据库