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

 

posted @ 2014-05-13 17:23  安全大可  阅读(430)  评论(0)    收藏  举报
真正的安全感源自于自身的实力
回顶部