PHP面向对象6之工具-魔术方法
PHP包含类文件:
1 <?php 2 /** 3 * PHP面向对象工具 --包含类文件 4 */ 5 //如果把Computer类放在一个单独的文件,名为:computer.class.php 6 /* 7 class Computer{ 8 public $_name ='dell'; 9 public function _run(){ 10 echo '运行'; 11 } 12 } 13 */ 14 //引用类文件 15 require 'computer.class.php'; 16 /* 17 * 缺点: 18 * 如果有多个类,需要引用很多 19 * 如果有用不到的,会产生浪费 20 * 如果遗漏了,会造成错误 21 */ 22 $com = new Computer(); 23 echo $com->_name; 24 $com->_run(); 25 ?>
需要的 computer.class.php:
1 <?php 2 //用到的类文件 3 class Computer{ 4 public $_name ='dell'; 5 public function _run(){ 6 echo '运行'; 7 } 8 } 9 ?>
需要的 person.class.php:
1 <?php 2 //用到的类文件 3 class Person{ 4 public function _run(){ 5 echo '联想'; 6 } 7 } 8 ?>
PHP魔术方法之__autoload()方法:
1 <?php 2 /** 3 * PHP面向对象工具--PHP魔术方法 4 * php引入了__autoload()内置方法来自动包含文件,__autoload()应该被写成单个参数的方法, 5 * 当php引擎遇到试图实例化未知类的操作时,会调用__autoload()方法,并将类名当作字符串参数传递给它。 6 */ 7 //$_className =类名 8 function __autoload($_className){ 9 require strtolower($_className.'.class.php'); 10 } 11 //自动引用computer类 12 $com = new Computer(); 13 echo $com->_name; 14 $com->_run(); 15 //自动引用person类 16 $per = new Person(); 17 $per->_run(); 18 19 ?>
PHP魔术方法之__call()方法:
1 <?php 2 /** 3 * PHP面向对象工具--PHP魔术方法 4 * php采用了__call()内置方法来屏蔽对象调用方法时产生的错误,当对象调用一个不存在的方法时, 5 * 会自动调用__call()方法。 6 */ 7 8 class Computer{ 9 public function _run(){ 10 echo '运行'; 11 } 12 public function __call($_methodName,$_argList){ 13 echo $_methodName.'方法不存在!'; 14 print_r($_argList); 15 } 16 } 17 //使用__call()方法来屏蔽调用错误 18 19 $com = new Computer(); 20 $com->_go('lee',123);//调用一个不存在的方法 21 ?>
PHP魔术方法之__tostring()方法:
<?php /** * PHP面向对象工具--PHP魔术方法 * php使用__tostring()内置方法来打印对象的引用,没有使用__tostring()的对象产生 * 一个错误,当打印对象的时候会自动调用__tostring()方法。 */ class Computer{ public function _run(){ echo '运行'; } private function __toString(){ return '我是对象字符串'; } } $com = new Computer(); echo $com; ?>
PHP魔术方法之__clone()方法:
1 <?php 2 /** 3 * PHP面向对象工具--PHP魔术方法 4 * php可以在类中定义一个__clone()内置方法来调整对象的克隆行为,当一个对象被克隆 5 * 的时候自动执行__clone()方法,而复制的对象可以在其方法体内进行调整。 6 */ 7 class Computer{ 8 public $_name = 'dell'; 9 public function _run(){ 10 echo '运行'; 11 } 12 //只有有克隆操作的时候,才会执行 13 public function __clone(){ 14 echo '克隆成功!'; 15 $this->_name='thinkpad'; 16 } 17 } 18 19 //引用传递 20 $com1= new Computer(); 21 $com2 = $com1; 22 $com2->_name='ibm'; 23 echo $com1->_name; 24 echo $com2->_name; 25 26 echo '<br />'; 27 28 //独立实例化 29 $com3 = new Computer(); 30 $com4 = new Computer(); 31 $com3->_name='联想'; 32 echo $com3->_name; 33 echo $com4->_name; 34 35 echo '<br />'; 36 37 //对象克隆 38 $com5 = new Computer(); 39 $com5->_name='acer'; 40 $com6 = clone $com5;//克隆之后,就相当于把被克隆对象又new了一个实例 41 echo $com5->_name; 42 echo $com6->_name; 43 ?>
PHP类函数和对象函数:
1 <?php 2 /** 3 * PHP面向对象工具--类函数和对象函数 4 * php提供了一系列强大的函数来检测类和对象,以便在第三方系统运行时知道正在使用的是哪个。 5 */ 6 class Computer{ 7 public function _run1(){ } 8 private function _run2(){} 9 public $_name1='小王'; 10 private $_name2='小李'; 11 } 12 class NoteComputer extends Computer{ 13 14 } 15 interface Person{ 16 17 } 18 19 $com = new Computer(); 20 $noteCom = new NoteComputer(); 21 //1、class_exists()函数表示类是否存在,如果类存在返回true,反之返回false 22 echo class_exists('Computer'); 23 echo '<br />'; 24 //2、get_class()函数获取对象的类名,如果不是对象,则返回false 25 echo get_class($com); 26 echo '<br />'; 27 //3、get_class_methods()函数获取类中的方法(公共的),以数组形式返回。 28 print_r(get_class_methods($com)); 29 echo '<br />'; 30 //4、get_class_vars()函数获取类中的字段(公共的),以数组形式返回。 31 print_r(get_class_vars('Computer')); 32 echo '<br />'; 33 //5、get_parent_class()函数获取子类的父类,如果没有则返回false 34 echo get_parent_class('NoteComputer'); 35 echo '<br />'; 36 //6、interface_exists()函数确定接口是否存在,如果存在返回true,反之返回false 37 echo interface_exists('Person'); 38 echo '<br />'; 39 //7、is_a()函数确定对象是否是类或者是否是这个类的父类时,如果是返回true,反之返回false 40 echo is_a($noteCom,'Computer'); 41 echo '<br />'; 42 //8、is_subclass_of()确定对象是否是类的子类,如果是返回true,反之返回false 43 echo is_subclass_of($noteCom, 'Computer'); 44 echo '<br />'; 45 //9、method_exists()函数确定对象的方法是否存在,如果是返回true,反之返回false 46 echo method_exists($com, '_run1'); 47 48 ?>
PHP反射机制:
1 <?php 2 /** 3 * PHP面向对象工具--反射API 4 * php5的类和对象函数并没有告诉我们类内部的一切,而只是报告了它们的公共成员,要充分了解一个类, 5 * 需要知道其私有成员和保护成员,还要知道其方法所期望的参数,对此,使用反射API。 6 */ 7 8 //查看自定义类 9 class Computer{ 10 public function _run1(){ } 11 private function _run2(){} 12 private static function _run3(){} 13 public $_name1='小王'; 14 private $_name2='小李'; 15 public static $_name3; 16 } 17 //使用反射API列出类的信息 18 echo '<pre>'; 19 echo 'Computer类信息:<br />'; 20 Reflection::export(new ReflectionClass('Computer')); 21 22 //列出内置的类信息 23 echo '内置类信息:<br />'; 24 Reflection::export(new ReflectionClass('Reflection')); 25 26 //获取类里的某个元素 27 $rc = new ReflectionClass('DateTime'); 28 $rb = new ReflectionClass('Computer'); 29 echo $rc->getName();//获取类名 30 echo '<br />'; 31 echo $rb->getFileName();//获取文件名 32 echo '<br />'; 33 print_r($rc->getConstants()); 34 35 ?>
本文发于:安全大可文章转载请注明出处:http://im404.cnblogs.com
相关事宜请联系:im404@qq.com

浙公网安备 33010602011771号