|
反射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()."
";
$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );
print $product2->getSummaryLine()."
";
*/
?>
<?php
require_once "fullshop.php";
$prod_class = new ReflectionClass( 'CdProduct' );
Reflection::export( $prod_class );
?>output: Class [ <user> class CdProduct extends ShopProduct ] {
@@ D:xampphtdocspopp-code5fullshop.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:xampphtdocspopp-code5fullshop.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:xampphtdocspopp-code5fullshop.php 63 - 65
}
Method [ <user, overwrites ShopProduct, prototype ShopProduct> public method getSummaryLine ] {
@@ D:xampphtdocspopp-code5fullshop.php 67 - 71
}
Method [ <user, inherits ShopProduct> public method getProducerFirstName ] {
@@ D:xampphtdocspopp-code5fullshop.php 17 - 19
}
Method [ <user, inherits ShopProduct> public method getProducerMainName ] {
@@ D:xampphtdocspopp-code5fullshop.php 21 - 23
}
Method [ <user, inherits ShopProduct> public method setDiscount ] {
@@ D:xampphtdocspopp-code5fullshop.php 25 - 27
- Parameters [1] {
Parameter #0 [ <required> $num ]
}
}
Method [ <user, inherits ShopProduct> public method getDiscount ] {
@@ D:xampphtdocspopp-code5fullshop.php 29 - 31
}
Method [ <user, inherits ShopProduct> public method getTitle ] {
@@ D:xampphtdocspopp-code5fullshop.php 33 - 35
}
Method [ <user, inherits ShopProduct> public method getPrice ] {
@@ D:xampphtdocspopp-code5fullshop.php 37 - 39
}
Method [ <user, inherits ShopProduct> public method getProducer ] {
@@ D:xampphtdocspopp-code5fullshop.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
";
}
if ( $class->isInternal() ) {
$details .= "$name is built-in
";
}
if ( $class->isInterface() ) {
$details .= "$name is interface
";
}
if ( $class->isAbstract() ) {
$details .= "$name is an abstract class
";
}
if ( $class->isFinal() ) {
$details .= "$name is a final class
";
}
if ( $class->isInstantiable() ) {
$details .= "$name can be instantiated
";
} else {
$details .= "$name can not be instantiated
";
}
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 "
----
";
}
function methodData( ReflectionMethod $method ) {
$details = "";
$name = $method->getName();
if ( $method->isUserDefined() ) {
$details .= "$name is user defined
";
}
if ( $method->isInternal() ) {
$details .= "$name is built-in
";
}
if ( $method->isAbstract() ) {
$details .= "$name is abstract
";
}
if ( $method->isPublic() ) {
$details .= "$name is public
";
}
if ( $method->isProtected() ) {
$details .= "$name is protected
";
}
if ( $method->isPrivate() ) {
$details .= "$name is private
";
}
if ( $method->isStatic() ) {
$details .= "$name is static
";
}
if ( $method->isFinal() ) {
$details .= "$name is final
";
}
if ( $method->isConstructor() ) {
$details .= "$name is the constructor
";
}
if ( $method->returnsReference() ) {
$details .= "$name returns a reference (as opposed to a value)
";
}
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 )."
";
}
function argData( ReflectionParameter $arg ) {
$details = "";
$declaringclass = $arg->getDeclaringClass();
$name = $arg->getName();
$class = $arg->getClass();
$position = $arg->getPosition();
$details .= "$$name has position $position
";
if ( ! empty( $class ) ) {
$classname = $class->getName();
$details .= "$$name must be a $classname object
";
}
if ( $arg->isPassedByReference() ) {
$details .= "$$name is passed by reference
";
}
if ( $arg->isDefaultValueAvailable() ) {
$def = $arg->getDefaultValue();
$details .= "$$name has default: $def
";
}
if ( $arg->allowsNull() ) {
$details .= "$$name can be null
";
}
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 |