$a=new test();
$b=new test2();
print_r( get_class_methods(‘test')); //或:print_r( get_class_methods($a)); 均返回:Array ( [0] => __construct [1] => getv )
echo ‘<br />';
print_r( get_class_vars(‘test')); //返回:Array ( [v] => 2 ),和上面不一样,不能用print_r( get_class_methods($a));
echo ‘<br />';
echo get_parent_class($b);//或get_parent_class(‘test2′); 返回test
echo ‘<br />';
echo is_a($b,'test');// 返回1
echo ‘<br />';
if(is_subclass_of(‘test2′,'test'))echo ‘是子类!'; //或(is_subclass_of($b,'test')),返回1,当参数1为$a时则返回false,
echo ‘<br />';
echo method_exists($a,'getv') //或用method_exists(‘test','getv')返回1,本函数也适用于用private等定义域的方法。
十一、自动加载类库文件:
当类多了以后,比如要在一个文件中载入3个类库文件:a.class.php,b.class.php,c.class.php要用三个require_once(‘classes/a.class.php);
require_once(‘classes/b.class.php);
require_once(‘classes/c.class.php);
可以用PHP5自动加载的功能来处理:在全局应用配置文件中,定义一个特殊的函数__autoload($class)函数(__autoload并不是一个类的方法,只是单独的函数,和类没有关系):
function __autoload($class){
require_once(“classes/$class)
}
该函数放哪没有关系,在创建类实例时,也不必去调用这个autoload函数。PHP会自动完成。但务必注意一点:“在调用页面上创建实例所使用的类名称”、和“被调用的文件名”、以及“该文件中的类的名称”3个必须是一样的。这样就不需要去调用__autoload();如果不一样则必须单独调用__autoload(‘c');并给它一个文件名前缀。如:
c.class.php文件的代码是:
复制代码 代码如下:
< ?php
class c{
public $m=7;
}
?>
这里代码的类名称是c,而文件名也是c,
现在要在index.php调用:
复制代码 代码如下:
< ?php
function __autoload($class){
require_once “$class.class.php”;
}
$m = new c(); //创建实例调用的类也是c
echo $m->m;
?>
此时PHP会自动调用根目录下的c.class.php中的类C。
但如果c.class.php中的代码是:
复制代码 代码如下:
< ?php
class mm{
public $m=7;
}
?>
而调用页index.php代码是:
复制代码 代码如下:
< ?php
function __autoload($class){
require_once “$class.class.php”;
}
# __autoload(‘c'); //如果不加这一行就会出错。
$m = new mm();
echo $m->m;
?>
会出错,提示找不到mm.class.php文件。这时可以加一行__autoload(‘c');但这样就达不到简化代码的目的。
类的家族化扩展:类的高级功能:
一、对象克隆:
当克隆一个对象的实例时,其属性初始值继承了被克隆对象的当前值。
复制代码 代码如下:
class test
{
public $p=5;
function __clone(){ //只在克隆发生时起作用。用于改变在克隆时某些值
$this->p=15;
}
}
$a=new test();
echo $a->p;
$a->p=8; //如果没有__clone()方法影响,$b的P值将为8
$b = clone $a;
echo $b->p; //15
二、对象继承:
没有被声明为final的类可以被继承,没有被final和private界定的方法也可以继承,没有被private界定的属性也可以继承。当子类继承了父类或超类后,可以直接使用父类或超类(祖父类以及祖父的祖父)的所有允许的方法,属性。
关键:理解构造函数和重载在继承中的特性!
(一)构造函数在继承中的特性:
1、当父类有构造函数而子类没有:则子类会在实例化时会自动执行父类的构造函数。这时如果要创建子类的实例,需要引入父类构造函数中所需的参数,否则出错。即使是“子类的子类”如果没有构造函数,也要在创建实例时输入其父类的父类的构造函数所需参数。PHP会从实例所在的子类会向上搜索合造的构造函数,一旦找到就停止,使用该构造函数。而不会再向上搜索,因此:子类本身如果没有构造函数,则以其最靠近的一个超类并且有构造函数的为准。
复制代码 代码如下: