php class类的用法详细总结。php class类的用法详细总结。

php class类的用法详细总结

 

以下是针对性php中class类的用法进行了详实的总介绍,需要的恋人可以恢复参考下

 

平:结构及调用(实例化):

class className{} ,调用:$obj = new
className();当类有构造函数时,还承诺传播参数。如$obj = new
className($v,$v2…);

仲:构造函数和析构函数:

1、构造函数用于初始化:使用__construct(),可带来参数。

2、但析构函数不克带参数(用于在销售去一个类似之前实施有操作还是效益)。析构函数用__destruct()做名。在本子执行了时,会销售掉内存中的靶子,因此而不要析造函数,但小按照COOKIE等,就应要就此者函数销掉。

知识点:在PHP4中为提供了构造函数,但采用的是和类似同名的类措施,在PHP5仍会配合这种做法,当一个接近吃从来不含__construct时,会招来和类似同名的章程,如果找到,就当是构造函数,如下:

复制代码代码如下:

class test
{ var $b;
function test() { $this->b=5; }
function addab($c) { return $this->b+$c; }
}
$a = new test(); echo $a->addab(4); // 返回 9

3、PHP不会见自行调用父类的构造函数(不支持构造函数重载),必须动parent关键字显式地调用。

复制代码代码如下:

class employee{
function __construct()….
}
class Manager extents Employee{
function __construct(){
parent::_construct();
echo ‘这个子类的父类构造函数调用了!’;
}
}

本为足以调用与拖欠实例没有另外关联的别样类的构造函数。只待以__construct()前增长类名即可。如:
otherClassName::__construct();

 

好像的主家庭成员:属性、方法、常量、静态成员

老三、类的性能: 发少数栽艺术对类的性质赋值或取值。
1、使用集体作用域public关键词。
2、使用__set()和__get()来分别赋值和取值,前者称设置方法(setter)或修改章程(mutator),后者名访问方法(accessor)或取得方式(getter)。建议用这种办法:优点:
A、可在__set()统一开展数据证实。
B、便于统一保管性。

注意:

第一:__set()和__get()只针对个体属性从作用,对于用public定义的性能,它们简单个都懒理搭理,如下:

复制代码代码如下:

class test{
protected $a=9,$b=2,$c;
public $d;
function __set($n,$v) { $this->$n = $v+2; }
function __get($name) { return $this->$name+2; }
}
$a = new test();
$a->b =5; echo “<br />”; echo $a->b;

实例只针对$a,$b,$c的设置会透过__set和__get过滤与归,对于$d,就非会见于作用。如$a->d=5,再回来还是5。

 

第二:__set($n,$v)要带动点儿只参数。而__get($n)只能发出一个参数。实例:

复制代码代码如下:

class test{
private $a=5,$b=6,$c;
function __set($n,$v)
{
if($n==’a’&&$n>0)
$this->$n = $v;
else
$this->$n = $v+2;
}
function __get($name)
{
return $this->$name; //如果改吧return $this->$name +
$this->addab();
如调用a的价值,实际返回的凡a+a+b的值。默认为5+5+6=16。
}
function addab()
{ return $this->a + $this->b; }
}
$e=new test();
$e->a = 11;
//注意写法:类的里用$this->$n即变量的写法,但外表实例要为此$e->a的法。
$e->b = 12; //get 14
$e->k = 22;

仿佛的性质可自由扩展,如上例的k,不管是不是就此__set,当一个实例建立起来后,可以据此$e->newProperty
= xx;直接来创造一个性质,但非建议如此做。

 

季、类的办法: 明成类当中的函数即可。

调用:

1、内部调用:可使用$this->Fanname();或$this->addab()或test::addab();

2、实例化调用时,用$e->addab();即可。对于以拖欠办法中无行使$this关键字的,如齐例被之:
function addab() { return $this->a+$this->b; }
变更呢: function addab() { return 25;
}那以以表实例调用该措施,也可用“$e::addab();”或“test::addab();”

五、类的常量: 假若类似的性理解成类中的变量,那么看似的常量和变量是勿一致的,其定义方法为:

复制代码代码如下:

class test{
private $a;
const PI = ‘3.14′;
…..
//在看似中调用上面的常量用鲜种办法,“$this::PI”,或
“类名::PI”,这里就是是test::PI,如下:
function getvalue(){
return $this->a * $this::PI; //或$this->a *
test::PI,用this关键字或者类名均只是,但都使就此对冒号。
}
}
$e= new test();
$e->PI =5; //注意,这里用
->只是创建了一个也是叫吧PI的性质,而未是转类吃的PI常量的值。
echo $e::PI; //这个才是调用类的常量。

常量只能用双冒号::来调用。并且不克改变其价值。
于相近外部实例化后调用接近常量同样也起有限栽方法。方法也:
“$e::PI” 或
“test::PI”,共同点是还如因此冒号,不同点是外表不可知用this关键字,只能用实例名,但类名::PI是通用的。

 

六、类的静态成员(静态属性或静态方法):

苟需要创造供所有类的实例共享的字段或措施。就得用静态成员。有星星点点个性状:

1、静态成员是共产主义者,它为脚论及的具有此类的实例调用,但不能够借助类的特定实例名调用,而是在类的外部,统一以“类名::$成员叫”的点子调用。而接近的里边则统一而用
“self::$成员称”来调用。

2、当各国一样不成新创造实例时,静态成员会从上次创的实例最后值开始还计算,而无是接近中初步的价开始计。

3、对于用public定义的静态成员,可以于外表更改它的值。private等则非常。

复制代码代码如下:

class test{
public static $v = 0;
function __construct(){ self::$v++; }
static function getV(){ return self::$v; }
}
$a = new test();
echo test::getV(); // 返回 1
$b = new test();
echo test::getV(); // 返回 2
test::$v=8; //由于public定义的成员,改变静态成员的价。
$c = new test();
echo test::getV(); // 返回 9

七、关键字: (一)this关键字:用于类的内部指代类的自。来访问属性或方法或者常量,如$this->属性名或措施名。$this::常量称为。this还可以就此当此类的子类中,来取代本身的性能或措施。

 

(二)双冒号“::”关键字:用于调用常量、静态成员。

(三)self关键字:在类的中间以及双冒号配合调用静态成员,如
self::$staticVar.,在近似的内部,不可知为此$this来调用静态成员。

(四)__toString():在类似吃使__toString(),用于将接近转成为字串并打印类,用处不充分:如:

复制代码代码如下:

class test{ public $p;
public function __toString(){ return var_export($this,TRUE); }
}
$a=new test();
echo $a; //输出:test::__set_state(array( ‘p’ => NULL,
)),或写成:echo $a->__toString();

(五)__clone()
:当克隆对象时,这个重要字才见面发生作用,用于转移克隆时或多或少价值。

 

(六)__call():方法重载,参下面示例:

复制代码代码如下:

class cB{
function __call($method,$n){
if($method==’showVarType’){
if(is_numeric($n[0])){ //不能用$n。要用$n[0];
$this->displayNum();
}else if (is_array($n[0])){
$this->displayArr();
}else{
$this->displayOther();
}
}
}
function displayNum() {
echo ‘<h3>这是数字!</h3>’;
}
function displayArr() {
echo ‘<h3>这是数组!</h3>’;
}
function displayOther() {
echo ‘<h3>不是数组也无是数字!</h3>’;
}
}

 

$x=’a’;
$y=array(‘a’,’b’);
$b=new cB;
$b->showVarType($x); //不是数组也不是数字
$b->showVarType($y); //这是数组

注意,不能够在接近吃定义showVarType()方法,否则代码不可知用。

 

(七)extends:继承: 如class a{} class b extends a{} 类b继承了类a

促:记忆:以后统一于调用方法要性能时用 “->
“,调用常量则用对冒号“::”,不见面搞晕。

八、方法以及性能之作用域:

共有6栽:public(默认,可略,也同样于php6的var声明),private(私有,也无克由子类使用),protected(私有,但可由于子类使用)
,abstract(抽象,参下文),final(阻止在子类中盖—也称重载,阻止给持续,用于修饰类名及方法,如final
class test{ final function fun(){}} ,但无可知用来属性),static(静态)

九:抽象类和架空方法(abstract——注意:没有所谓泛属性):

虚幻可以知晓成父类为子类定义了一个模板或基类。作用域abstract只于父类中声称,但于子类中落实。注意事项:

1、抽象类不克为实例化,只能被子类(具体类)继承后实现。

2、抽象类必须以那个子类中落实该抽象类的拥有抽象方法。否则会错。

3、在空洞方法吃,只是声明,但不克切实贯彻:如abstract function gettow(){
return $this->p; }是蹭的,只能声明是艺术:abstract function
gettow();(连方括号{}都休想出现),抽象方法与浮泛类重要用来复杂的类层次关系面临。该层次关系要保证各一个子类都包含并重载了一点特定的法门。这也足以经过接口实现

4、属性不可知被取名也架空属性,如abstract $p = 5凡是蹭的。

5、只有声明也架空的类似可声明抽象方法,但一旦方式声明也架空,就未能够实际实现。如:

复制代码代码如下:

abstract class Employee
{
abstract function a(…);
abstract function b(…);
}

从此以后还针对是父类扩展,组成各种子类(如经,员工,出纳)。

 

6、抽象类吃,如果如落实具体的道,不能够声称也架空。这样或实际意义更怪。可以拿几单类库中共同的一对提取及虚幻类中,其它的接近继承抽象类即可。如下:

复制代码代码如下:

abstract class BaseShop{
Const TAX=0.06; // 在空虚类中定义常量
public function buy($gid) { // 如果定义为架空方法abstract function
buy()就非能够于此间实现重心。
echo(‘你进了ID为 :’.$gid.’的商品’);
}
public function sell($gid) {
echo(‘你卖了ID为 :’.$gid.’的商品’);
}
public function view($gid) {
echo(‘你查了ID为 :’.$gid.’的商品’);
}
}
class BallShop extends BaseShop{
var $itme_id = null;
public function __construct()
{
$this->itme_id = 2314;
}
public function open()
{
$this->sell($this->itme_id);
}
public function getTax()
{
echo printf(‘<h3>平均税率是 %d%%。</h3>’,$this::TAX*100);
}
}
$s = new BallShop;
$s->open(); //你卖了ID为 :2314的商品
$shop->getTax();

十:类型提示: 瞩目,类型提示作用只能用于参数为目标的提醒,而望洋兴叹用于为整数,字串,浮点等品类提示。有些近乎的计需要传入的参数为所想的对象类型,可以就此脚的不二法门齐强制实施这个替则。要达类型提示,只要以措施的目标型参数前加一个一度是的好像的名称,如:function
funname(OtherClassName
$otherclassINSName,$c….),注意,OtherClassName必须是存的接近。如下:

复制代码代码如下:

class em{ var $k=56; }
class test{
function __construct()
{ echo $this->addab(new em(),2); }

 

function addab(em $j,$c)
//这个措施,即可以当内部调用,也得以以表调用。只要作用域许可。
{ return $j->k+$c; }
}
$a = new test();
$b = new em();
echo $a->addab($b,2); //或 $a->addab(new em(),2);

十一、类的管理:

 

1、instanceof关键字:用于分析一个目标是否是某某一个接近的实例或子类或是实现了某个特定的接口:如下例,但若是顾:
类名没有任何引号等定界符,否则会出错。如test不克就此’test’

复制代码代码如下:

class test2{}
class test{}
class testChilern Extends test{}
$a = new test2();
$m = new test();
$i = ($m instanceof test);
if($i)echo ‘$m是类test的实例!<br />’; // get this value
switch ($a instanceof test){
case true :
echo ‘YES<br />’;
break;
case false :
echo ‘No<br />’; //get this value
break;
}
$d=new testChilern();
if($d instanceof test)echo ‘$d是类test的子类!<br />’; // get this
value

2、确定类是否存在:boolean class_exists(string class_name):
class_exists(‘test’);

 

3、返回类名:string
get_class(object),成功时返回实例的类名,失败则回FALSE:

$a = new test2(); echo get_class($a); //返回 test2

4、了解类的公用属性:array get_class_vars(‘className’)
,返回关键数组:包含有定义的public属性名及其对应的价。这个函数不可知因此实例名做变量

5、返回类措施:get_class_methods(‘test’); //或:
get_class_methods($a);可用实例名做参数,返回包括构造函数在内的拥有非私有方法。

6、print_r(get_declared_classes())了解当前PHP版本被存有的类名。PHP5有149只。

7、get_object_vars($a)返回实例中拥有公用的习性与其值的关系数组。注意其同get_class_vars()的区别:
/* (1)
get_object_vars($a)是用实例名做参数,而get_class_vars(‘test’)是因此接近名做参数。
* (2)
get_object_vars($a)获得的属性值是实例运行后底价,而get_class_vars(‘test’)获得的属于性值是相仿吃的起定义。
* (3)
两者均归关联数组,且全对莫赋值的性返回NULL的价值。如类test中有定义了public
$q;则回Array ( [v] => 5 [q]=>) ,
*/

8、返回父类的号:get_parent_class($b);//或get_parent_class(‘test2′);
返回test

9、确定接口是否有:boolean interface_exists($string
interface[,boolean autoload])

10、确定目标类型: boolean
is_a($obj,’className’),当$obj属于CLASSNAME类时,或属于该子类时,返回TRUE,如果$obj与class类型无关则回FALSE。如:is_a($a,’test’)

11、确定是不是是某类的支行对象:当$b是持续自TEST类时,返回TRUE,否则FALSE。boolean
is_subclass_of($b,’test’);

12、确定类或实例中,是否存在有艺术。method_exists($a,’getv’)
//或用method_exists(‘test’,’getv’),此函数适用于非public定义的作用域的道。

以上函数实例:

复制代码代码如下:

class test{
public $v=2;
private $c=5;
function __construct(){
$this->v=5;
}
private function getv(){
return $this->v;
}
}
class test2 extends test{}

 

$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会从实例所于的子类会向上搜索合造的构造函数,一旦找到就终止,使用该构造函数。而无会见重新升华搜索,因此:子类本身若无构造函数,则为该极其靠近的一个超类并且产生构造函数的为本。

复制代码代码如下:

class cA{
public $name,$age;
function __construct($n) {
$this->name = $n;
$this->age = 25;
}
function __set($n,$v) {
$this->$n = $v;
}
function __get($n) {
return $this->$n;
}
}

 

class cB extends cA{
function funB1() { echo ‘<h3>Class cB execute
success!</h3>’; }
}

class cC extends cB {
function funC1() { echo ‘<h3>Class cC FunC1!</h3>’; }
}
$b=new cB(‘Jack’);
$b->name=’John’;
echo “$b->name : $b->age”;
$b->funB1();
$c=new cC();
//这里会拧,由于cB也从不构造函数,因此再度发展为cA为仍,需要一个参数。改也$c=new
cC(‘David’);即可。
echo $c->name(); //David

2、当子类为出构造函数时:这时,不管父类是否有构造函数,都见面实施子类自己的构造函数。
如上:

复制代码代码如下:

class cB extends cA{
function __construct() {
echo ‘<h3>this is Class cB \’s __construct!</h3>’;
}
function funB1() {
echo ‘<h3>Class cB execute success!</h3>’;
}
}

本类CB有好的构造函数时,这时创建实例$b=new
cB(‘Jack’);参数JACK不见面于作用,因为父类CA的构造函数没有沾推行。因此$b->name和$->age就非会见初始化值。需要另外赋值$b->name=’Jack’,$b->age=25;
假若这时如实施父类CA的构造函数,可以如此:

复制代码代码如下:

function __construct($n) {
parent::__construct($n); // 或:cA::__construct($n);
echo ‘<h3>this is Class cB \’s __construct!</h3>’;
}

由于parent::__construct($n);
只会向上搜索父类的构造函数,一找到就歇且行时找到的构造函数,因此当上面例子中,如果parent::__construct($n)是因此在最后一层的类cC中,并且类CB,CA都生构造函数,那么cC的实例只会履行cB的构造函数。不见面执行cA。这时,如果CC的实例想还调用CA和CB的构造函数,有一定量栽方法:

 

A、在CB中呢参加parent::__construct($n)
B、在CC中把构造函数改也:

复制代码代码如下:

function __construct($n) {
cA::__construct($n); //即:类名::构造函数。
cB::__construct();
echo ‘<h3>this is Class cB \’s __construct!</h3>’;
}

(二)在子类中调用父类的习性或方法:

 

1、调用父类方法:在子类中调用父类的计,有3种方式:
$this->ParentFunction(); 或
父类名::ParentFunction(); 或
parent::parentFun();

2、调用父类属性:只能用$this->ParentProperty;

(三)重载:

每当子类中,可以定义和父类相同属性或方法,改变父类该属性或措施的值或操作,称做重载。如:
calss ParClass{ function pfun(){ ….}}
class ChildrenClass extends ParClass{function pfun(){ ….}}}
//重载了父类的pfun的章程。
当子类中重载后,优先履好重载后的新定义的道还是性能。
否得以子类中之所以parent::parentFun();调用父类的方式,但所取的价值是子类自己输入的参数运算值。而非是该办法在父类中运算的值。

三、接口:

接口:interface,可以领略成一组功能的一块儿规范,最充分意思或者就是当多人合作时,为独家的开规定一个合的计名称。

及浮泛类吃的架空方法同样:

1、不能够于接口中针对法具体贯彻进行定义。而是由具体类来落实(而空虚类吃之免抽象方法好不用再度定义,只有空虚方法及接口是同要求如以切切实实类吃贯彻)。

2、和虚幻类一样,可以当接口中定义常量,并出于现实类直接接轨。

3、具体类必须兑现抽象类的持有抽象方法(非抽象方法除外),同样,具体类设经implements实现了接口后,必须得接口中的装有术。

接口实现过程:1、定义接口,2、用..implement X,Y,…和具体类对接。

复制代码代码如下:

interface Info{ //定义接口
const N=22;
public function getage();
public function getname();
}

 

class age implements Info //如要多单接口 class age (extends emJob)
implements Info,interB…
{
public $age=15;
public $name=’Join’;
function getage() {
echo “年级是$this->age”;
}
function getname() {
echo “姓名是$this->name”;
}
function getN(){
echo ‘<h3>在接口中定义之常量N的值是:’.$this::N.’ </h3>’;
//直接继承接口中之常量值。
}
}

$age=new age;
echo $age::N; //22,直接调用接口中之常量值。
$age->getN();

有关抽象类和接口类的采取分别:何时用接口,何时用抽象?

 

1、相关性:当创建的模子由局部严密有关的目标下时,用抽象。对于未系对象下的法力,用接口。

2、多还继承:PHP类可以连续多个接口,但无能够扩大多单抽象类。

3、公共行为实现:抽象类可当中间落实国有的法子,但接口非常。

季、命名空间(PHP6)

类库脚本A.inc.php和本子B.inc.php中还一个近似的称也 class
CNAME,并且及时有限只文本要当与一个文本要index.php中为调用。这时要就此到命名空间。

步聚:

1、打开上面的A和B两独文件,分别于上头的极致前头各加一行:

namespace SPACEA; 和 namespace SPACEB; 名字起自然。

2、在index.php中实例化类时,在类似的前头添加命名空间与双冒号做呢前缀:
include ‘a.inc.php’;
include ‘b.inc.php’;
$a=new SPACEA::CNAME();
$b=new SPACEB::CNAME();

如此这般便无见面冲了。
但是当PHP6正式公布前,这个功能还未定下来。

五、实现迭代器和迭代。 参《PHP圣经》P142;

六、使用Reflection(反射)API 。 概括实例:
class a{ …. }
$c = new ReflectionClass(‘a’); //PHP 内置类。
echo ‘<pre>’.$c.'</pre>’;
输出类a的结构与情节。参《PHP圣经》P145;

以下是指向php中class类的用法进行了详细的下结论介绍,需要之情侣可以回复参考下

同样:结构以及调用(实例化):

class className{} ,调用:$obj = new
className();当类有构造函数时,还承诺传播参数。如$obj = new
className($v,$v2…);

仲:构造函数和析构函数:

1、构造函数用于初始化:使用__construct(),可带参数。

2、但析构函数不克带参数(用于在销售去一个看似之前实施有操作还是效益)。析构函数用__destruct()做名。在本子执行完毕时,会销售掉内存中的目标,因此而不要析造函数,但多少按照COOKIE等,就相应要用是函数销掉。

知识点:在PHP4中吗提供了构造函数,但运用的是和类似同名的接近措施,在PHP5仍能配合这种做法,当一个类似中从来不包含__construct时,会招来和类似同名的方法,如果找到,就以为是构造函数,如下:

复制代码代码如下:

class test
{ var $b;
function test() { $this->b=5; }
function addab($c) { return $this->b+$c; }
}
$a = new test(); echo $a->addab(4); // 返回 9

3、PHP不见面活动调用父类的构造函数(不支持构造函数重载),必须以parent关键字显式地调用。

复制代码代码如下:

class employee{
function __construct()….
}
class Manager extents Employee{
function __construct(){
parent::_construct();
echo ‘这个子类的父类构造函数调用了!’;
}
}

本来为堪调用与该实例没有任何关系之其它类的构造函数。只需要在__construct()前增长类名即可。如:
otherClassName::__construct();

类似的预兆家庭成员:属性、方法、常量、静态成员

老三、类的性能: 有少数种植方法对类的性质赋值或取值。
1、使用集体作用域public关键词。
2、使用__set()和__get()来分别赋值和取值,前者称设置方式(setter)或改章程(mutator),后者叫访问方法(accessor)或取得方式(getter)。建议使用这种办法:优点:
A、可在__set()统一开展多少印证。
B、便于统一管理性。

注意:

第一:__set()和__get()只针对私有属性从作用,对于用public定义的特性,它们简单独都懒理搭理,如下:

复制代码代码如下:

class test{
protected $a=9,$b=2,$c;
public $d;
function __set($n,$v) { $this->$n = $v+2; }
function __get($name) { return $this->$name+2; }
} //www.jbxue.com
$a = new test();
$a->b =5; echo “<br />”; echo $a->b;

实例只对$a,$b,$c的装置会经过__set和__get过滤与归,对于$d,就不见面打作用。如$a->d=5,再回还是5。

第二:__set($n,$v)要带点儿单参数。而__get($n)只能有一个参数。实例:

复制代码代码如下:

class test{
private $a=5,$b=6,$c;
function __set($n,$v)
{
if($n==’a’&&$n>0)
$this->$n = $v;
else
$this->$n = $v+2;
}
function __get($name)
{
return $this->$name; //如果改呢return $this->$name +
$this->addab();
如调用a的价值,实际返回的是a+a+b的价。默认为5+5+6=16。
}
function addab()
{ return $this->a + $this->b; }
}
$e=new test();
$e->a = 11;
//注意写法:类的内用$this->$n即变量的写法,但表面实例要因此$e->a的计。//www.jbxue.com
 $e->b = 12; //get 14
$e->k = 22;

类似的特性可自由扩展,如上例的k,不管是否因此__set,当一个实例建立起后,可以为此$e->newProperty
= xx;直接来创造一个特性,但非建议这样做。

季、类的点子: 喻成类当中的函数即可。

调用:

1、内部调用:可使用$this->Fanname();或$this->addab()或test::addab();

2、实例化调用时,用$e->addab();即可。对于以拖欠办法中没有动$this关键字的,如达到例被之:
function addab() { return $this->a+$this->b; }
变更呢: function addab() { return 25;
}那在当外部实例调用该法,也可用“$e::addab();”或“test::addab();”

五、类的常量: 苟类似的属性理解成类中的变量,那么看似的常量和变量是匪一样的,其定义方法为:

复制代码代码如下:

class test{
private $a;
const PI = ‘3.14′;
…..
//在接近中调用上面的常量用简单栽方式,“$this::PI”,或
“类名::PI”,这里就是是test::PI,如下:
function getvalue(){
return $this->a * $this::PI; //或$this->a *
test::PI,用this关键字或者类名均只是,但还使因此双冒号。
}
} //www.jbxue.com
 $e= new test();
$e->PI =5; //注意,这里用
->只是创建了一个呢是称吧PI的特性,而未是反类中之PI常量的价。
echo $e::PI; //这个才是调用类的常量。

常量只能用对冒号::来调用。并且不可知转其价值。
在相近外部实例化后调用接近常量同样也生零星栽艺术。方法为:
“$e::PI” 或
“test::PI”,共同点是都要为此冒号,不同点是外部不克就此this关键字,只能用实例名,但类名::PI是通用的。

六、类的静态成员(静态属性或静态方法):

设若用创造供所有类的实例共享的字段或措施。就得用静态成员。有半点独特征:

1、静态成员是共产主义者,它让脚论及之拥有此类的实例调用,但非能够借助类的特定实例名调用,而是在类的表,统一运用“类名::$成员称”的道调用。而近乎的中则统一而用
“self::$成员称”来调用。

2、当各国一样破新创建实例时,静态成员会从上次创设的实例最后值开始重新计算,而无是看似中开始的价值开始计。

3、对于用public定义的静态成员,可以以表更改它的价值。private等则很。

复制代码代码如下:

class test{
public static $v = 0;
function __construct(){ self::$v++; }
static function getV(){ return self::$v; }
}
$a = new test();
echo test::getV(); // 返回 1
$b = new test();
echo test::getV(); // 返回 2
test::$v=8; //由于public定义之分子,改变静态成员的价。
$c = new test();
echo test::getV(); // 返回 9

七、关键字: (一)this关键字:用于类的里指代类的本身。来访问属性或方法或者常量,如$this->属性名或措施名。$this::常量名为。this还得为此当此类的子类中,来顶替本身的性能或方法。

(二)双冒号“::”关键字:用于调用常量、静态成员。

(三)self关键字:在类的中间及双冒号配合调用静态成员,如
self::$staticVar.,在相近的里边,不能够因此$this来调用静态成员。

(四)__toString():在看似吃运用__toString(),用于将类似转成为字串并打印类,用处不雅:如:

复制代码代码如下:

class test{ public $p;
public function __toString(){ return var_export($this,TRUE); }
}
$a=new test();
echo $a; //输出:test::__set_state(array( ‘p’ => NULL,
)),或写成:echo $a->__toString();

(五)__clone()
:当克隆对象时,这个关键字才会发出作用,用于转移克隆时某些价值。

(六)__call():方法重载,参下面示例:

复制代码代码如下:

class cB{
function __call($method,$n){
if($method==’showVarType’){
if(is_numeric($n[0])){ //不能用$n。要用$n[0];
$this->displayNum();
}else if (is_array($n[0])){
$this->displayArr();
}else{
$this->displayOther();
}
}
}
function displayNum() {
echo ‘<h3>这是数字!</h3>’;
}
function displayArr() {
echo ‘<h3>这是数组!</h3>’;
} //www.jbxue.com
 function displayOther() {
echo ‘<h3>不是数组也无是数字!</h3>’;
}
}

$x=’a’;
$y=array(‘a’,’b’);
$b=new cB;
$b->showVarType($x); //不是数组也未是数字
$b->showVarType($y); //这是数组

留意,不可知以近似中定义showVarType()方法,否则代码不能够因此。

(七)extends:继承: 如class a{} class b extends a{} 类b继承了类a

促:记忆:以后统一以调用方法或者性质时用 “->
“,调用常量则就此对冒号“::”,不见面搞晕。

八、方法与性能之作用域:

共有6种:public(默认,可略,也一如既往于php6的var声明),private(私有,也未克由子类使用),protected(私有,但但由子类使用)
,abstract(抽象,参下文),final(阻止在子类中蒙—也如重载,阻止给连续,用于修饰类名及方法,如final
class test{ final function fun(){}} ,但无克用于属性),static(静态)

九:抽象类和架空方法(abstract——注意:没有所谓泛属性):

泛泛可以领略成父类为子类定义了一个模板或基类。作用域abstract只于父类中声称,但在子类中实现。注意事项:

1、抽象类非克让实例化,只能被子类(具体类)继承后实现。

2、抽象类必须于其子类中落实该抽象类的兼具抽象方法。否则会出错。

3、在泛方法中,只是声明,但未能够实际实现:如abstract function gettow(){
return $this->p; }是错的,只能声明是办法:abstract function
gettow();(连方括号{}都并非出现),抽象方法及虚幻类主要用以复杂的好像层次关系受到。该层次关系需保证各一个子类都含并重载了一点特定的措施。这也得经接口实现

4、属性不可知为取名也架空属性,如abstract $p = 5凡是蹭的。

5、只有声明也架空的类似可声明抽象方法,但一旦艺术声明也架空,就未可知具体落实。如:

复制代码代码如下:

abstract class Employee
{
abstract function a(…);
abstract function b(…);
}

日后重新指向是父类扩展,组成各种子类(如经,员工,出纳)。

6、抽象类吃,如果假定落实具体的不二法门,不克声称也架空。这样也许实际意义更甚。可以将几只类库中一块的一些提取到虚幻类中,其它的切近继承抽象类即可。如下:

复制代码代码如下:

abstract class BaseShop{
Const TAX=0.06; // 在空虚类吃定义常量
public function buy($gid) { // 如果定义也架空方法abstract function
buy()就非能够当这里实现主体。
echo(‘你买了ID为 :’.$gid.’的商品’);
}
public function sell($gid) {
echo(‘你卖了ID为 :’.$gid.’的商品’);
}
public function view($gid) {
echo(‘你查看了ID为 :’.$gid.’的商品’);
}
}
class BallShop extends BaseShop{
var $itme_id = null;
public function __construct()
{
$this->itme_id = 2314;
}
public function open()
{
$this->sell($this->itme_id);
}
public function getTax()
{
echo printf(‘<h3>平均税率是 %d%%。</h3>’,$this::TAX*100);
}
}
$s = new BallShop;
$s->open(); //你卖了ID为 :2314的商品
$shop->getTax();

十:类型提示: 留神,类型提示意义只能用来参数为对象的提拔,而无法用于为整数,字串,浮点等种类提示。有些类似的措施要传入的参数为所幸的对象类型,可以据此脚的不二法门齐强制实施是替则。要达类型提示,只要以法的对象型参数前加一个曾在的好像的称谓,如:function
funname(OtherClassName
$otherclassINSName,$c….),注意,OtherClassName必须是存的近乎。如下:

复制代码代码如下:

class em{ var $k=56; }
class test{
function __construct()
{ echo $this->addab(new em(),2); }

function addab(em $j,$c)
//这个法子,即好以其间调用,也可在表面调用。只要作用域许可。
{ return $j->k+$c; }
}
$a = new test();
$b = new em();
echo $a->addab($b,2); //或 $a->addab(new em(),2);

十一、类的管住:

1、instanceof关键字:用于分析一个靶是否是某一个接近的实例或子类或是实现了某特定的接口:如下例,但如小心:
类名没有其余引号等定界符,否则会错。如test不克为此’test’

复制代码代码如下:

class test2{}
class test{}
class testChilern Extends test{}
$a = new test2();
$m = new test();
$i = ($m instanceof test);
if($i)echo ‘$m是类test的实例!<br />’; // get this value
switch ($a instanceof test){
case true :
echo ‘YES<br />’;
break;
case false :
echo ‘No<br />’; //get this value
break;
}
$d=new testChilern();
if($d instanceof test)echo ‘$d是类test的子类!<br />’; // get this
value

2、确定类是否在:boolean class_exists(string class_name):
class_exists(‘test’);

3、返回类名:string
get_class(object),成功时回来实例的类名,失败则归FALSE:

$a = new test2(); echo get_class($a); //返回 test2

4、了解类的公用属性:array get_class_vars(‘className’)
,返回关键数组:包含有定义之public属性名及其对应的价。这个函数不可知就此实例名做变量

5、返回类措施:get_class_methods(‘test’); //或:
get_class_methods($a);可用实例名做参数,返回包括构造函数在内的拥有非私有方法。

6、print_r(get_declared_classes())了解时PHP版本中持有的类名。PHP5有149独。

7、get_object_vars($a)返回实例中装有公用的特性与其值的涉数组。注意她与get_class_vars()的区别:
/* (1)
get_object_vars($a)是为此实例名做参数,而get_class_vars(‘test’)是故类似名做参数。
* (2)
get_object_vars($a)获得的属性值是实例运行后的价,而get_class_vars(‘test’)获得的属性值是近乎吃的发端定义。
* (3)
两者均归关联数组,且都指向未赋值的性能返回NULL的值。如类test中起定义了public
$q;则归Array ( [v] => 5 [q]=>) ,
*/

8、返回父类的名:get_parent_class($b);//或get_parent_class(‘test2′);
返回test

9、确定接口是否留存:boolean interface_exists($string
interface[,boolean autoload])

10、确定目标类型: boolean
is_a($obj,’className’),当$obj属于CLASSNAME类时,或属于该子类时,返回TRUE,如果$obj与class类型无关则赶回FALSE。如:is_a($a,’test’)

11、确定是不是是某类的分层对象:当$b是继续自TEST类时,返回TRUE,否则FALSE。boolean
is_subclass_of($b,’test’);

12、确定类或实例中,是否有有艺术。method_exists($a,’getv’)
//或用method_exists(‘test’,’getv’),此函数适用于非public定义的作用域的法子。

如上函数实例:

复制代码代码如下:

class test{
public $v=2;
private $c=5;
function __construct(){
$this->v=5;
}
private function getv(){
return $this->v;
}
}
class test2 extends test{}

$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 />’; //www.jbxue.com
 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会从实例所于的子类会向上搜索合造的构造函数,一旦找到就停,使用该构造函数。而休见面再次提高搜索,因此:子类本身若没构造函数,则因那极接近的一个超类并且有构造函数的呢按照。

复制代码代码如下:

class cA{
public $name,$age;
function __construct($n) {
$this->name = $n;
$this->age = 25;
}
function __set($n,$v) {
$this->$n = $v;
}
function __get($n) {
return $this->$n;
}
} //www.jbxue.com

class cB extends cA{
function funB1() { echo ‘<h3>Class cB execute
success!</h3>’; }
}

class cC extends cB {
function funC1() { echo ‘<h3>Class cC FunC1!</h3>’; }
}
$b=new cB(‘Jack’);
$b->name=’John’;
echo “$b->name : $b->age”;
$b->funB1();
$c=new cC();
//这里会出错,由于cB也绝非构造函数,因此更前行为cA为依照,需要一个参数。改呢$c=new
cC(‘David’);即可。
echo $c->name(); //David

2、当子类为发构造函数时:这时,不管父类是否生构造函数,都见面履行子类自己的构造函数。
如上:

复制代码代码如下:

class cB extends cA{
function __construct() {
echo ‘<h3>this is Class cB \’s __construct!</h3>’;
}
function funB1() {
echo ‘<h3>Class cB execute success!</h3>’;
}
}

现在类CB有温馨之构造函数时,这时创建实例$b=new
cB(‘Jack’);参数JACK不见面由作用,因为父类CA的构造函数没有博得执行。因此$b->name和$->age就未会见初始化值。需要另外赋值$b->name=’Jack’,$b->age=25;
假定这时候如履父类CA的构造函数,可以如此:

复制代码代码如下:

function __construct($n) {
parent::__construct($n); // 或:cA::__construct($n);
echo ‘<h3>this is Class cB \’s __construct!</h3>’;
}

由于parent::__construct($n);
只见面向上搜索父类的构造函数,一找到就已且行时找到的构造函数,因此当地方例子中,如果parent::__construct($n)是因此在最后一层的类cC中,并且类CB,CA都发构造函数,那么cC的实例只会实施cB的构造函数。不会见履cA。这时,如果CC的实例想都调用CA和CB的构造函数,有些许种植艺术:

A、在CB中吗参加parent::__construct($n)
B、在CC中把构造函数改吧:

复制代码代码如下:

function __construct($n) {
cA::__construct($n); //即:类名::构造函数。
cB::__construct();
echo ‘<h3>this is Class cB \’s __construct!</h3>’;
}

(二)在子类中调用父类的特性或方式:

1、调用父类方法:在子类中调用父类的方式,有3种植艺术:
$this->ParentFunction(); 或
父类名::ParentFunction(); 或
parent::parentFun();

2、调用父类属性:只能用$this->ParentProperty;

(三)重载:

以子类中,可以定义跟父类相同属性或方式,改变父类该属性或措施的价或操作,称做重载。如:
calss ParClass{ function pfun(){ ….}}
class ChildrenClass extends ParClass{function pfun(){ ….}}}
//重载了父类的pfun的不二法门。
在子类中重载后,优先履好重载后的新定义之主意要性质。
为可以当子类中因故parent::parentFun();调用父类的措施,但所取的价是子类自己输入的参数运算值。而非是该办法在父类中运算的价值。

三、接口:

接口:interface,可以知晓成一组功能的旅规范,最充分意思恐怕就是在多人口搭档时,为各自的开规定一个一起的法子名称。

与虚幻类中之肤浅方法同样:

1、不可知以接口中针对章程具体贯彻进行定义。而是由于现实类来兑现(而空虚类中之未抽象方法好不必还定义,只有空虚方法与接口是相同要求如当实际类中贯彻)。

2、和浮泛类一样,可以于接口中定义常量,并出于具体类直接接轨。

3、具体类必须贯彻抽象类的备抽象方法(非抽象方法除外),同样,具体类设通过implements实现了接口后,必须就接口中的装有办法。

接口实现过程:1、定义接口,2、用..implement X,Y,…和具体类对接。

复制代码代码如下:

interface Info{ //定义接口
const N=22;
public function getage();
public function getname();
}

class age implements Info //如要多单接口 class age (extends emJob)
implements Info,interB…
{
public $age=15;
public $name=’Join’;
function getage() {
echo “年级是$this->age”;
}
function getname() {
echo “姓名是$this->name”;
}
function getN(){
echo ‘<h3>在接口中定义的常量N的价是:’.$this::N.’ </h3>’;
//直接继承接口中的常量值。
}
}

$age=new age;
echo $age::N; //22,直接调用接口中的常量值。
$age->getN();

关于抽象类和接口类的采取分别:何时用接口,何时用抽象?

1、相关性:当创建的模子由局部严密有关的靶子下时,用抽象。对于未系对象下的效用,用接口。

2、多更继承:PHP类可以连续多个接口,但无克扩大多单抽象类。

3、公共行为实现:抽象类可在其中落实公的不二法门,但接口非常。

季、命名空间(PHP6)

类库脚本A.inc.php和本子B.inc.php中都一个好像的称为 class
CNAME,并且就点儿个文本要以跟一个文本要index.php中被调用。这时要用到命名空间。

步聚:

1、打开上面的A和B两单文件,分别于上头的最好前各加一行:

namespace SPACEA; 和 namespace SPACEB; 名字起自然。

2、在index.php中实例化类时,在近似的眼前添加命名空间以及双冒号做吧前缀:
include ‘a.inc.php’;
include ‘b.inc.php’;
$a=new SPACEA::CNAME();
$b=new SPACEB::CNAME();

这般就非会见冲了。
而是在PHP6正式宣告前,这个作用还未定下来。

五、实现迭代器和迭代。 参《PHP圣经》P142;

六、使用Reflection(反射)API 。 粗略实例:
class a{ …. }
$c = new ReflectionClass(‘a’); //PHP 内置类。
echo ‘<pre>’.$c.'</pre>’;
输出类a的布局以及情节。参《PHP圣经》P145;

相关文章

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注