PHP Object-Oriented Programming and reflection API details, object-oriented reflection

Source: Internet
Author: User

PHP Object-Oriented Programming and reflection API details, object-oriented reflection

This article describes PHP Object-Oriented Programming and reflection APIs. We will share this with you for your reference. The details are as follows:

Understanding class

Class_exists

<? Php // TaskRunner. php $ classname = "Task"; $ path = "tasks/{$ classname}. php"; if (! File_exists ($ path) {throw new Exception ("No such file as {$ path}"); // throw an Exception, class file does not exist} require_once ($ path ); $ qclassname = "tasks \ $ classname"; if (! Class_exists ($ qclassname) {throw new Exception ("No such class as $ qclassname"); // throw an Exception. The class does not have a Fatal error: uncaught exception 'exception' with message' No such class as tasks \ task' Stack trace: #0 {main }}$ myObj = new $ qclassname (); $ myObj-> doSpeak ();?>

Get_class check the instanceof class of the object to verify whether the object belongs to a class

<? Phpclass CdProduct {} function getProduct () {return new CdProduct ("Exile on Coldharbour Lane", "The", "Alabama 3", 10.99, 60.33 ); // return a Class Object} $ product = getProduct (); if (get_class ($ product) = 'cdproduct ') {print "\ $ product is a CdProduct object \ n" ;}?> <? Phpclass 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 obtains the list of all methods in the class. Only public methods, protected and private methods are obtained. The default value is public.

<?phpclass 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)

More Verification

<?phpclass 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 nameprint $product->$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 Method

<? Phpclass 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) {// execute the call method if (method_exists ($ this-> thirdpartyShop, $ method) when the unnamed method is called )) {return $ this-> thirdpartyShop-> $ method () ;}}$ d = new Deltas Tor (); $ d-> thing ();?>

Output:

Thing

Parameter passing

<?phpclass 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)

Reflection API

Fullshop. php

<?phpclass 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";*/?><?phprequire_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  } }}

Comment: The class is better than var_dump. What attributes are inherited and what classes are inherited. The methods in the class are self-defined, overwritten, and inherited.

View class data

<?phprequire_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

View Method Data

<?phprequire_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 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

Obtain the constructor Parameters

<?phprequire_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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.