static静态关键字
声明类特点和办法为静态,不能够经过类的实例直接拜访。
类的静态特点不能经过->直接拜访,能够经过
o
b
j
:
:
obj::
obj::name来拜访。
静态办法能够经过类的实例来拜访。
<?php
classPerson
{
publicstaticKaTeX parse error: Expected 'EOF', got '}' at position 71: …sissay"; } }̲ echoPerson::name;//miss
p
e
r
s
o
n
=
n
e
w
P
e
r
s
o
n
(
)
;
e
c
h
o
person=newPerson(); echo
person=newPerson(); echoperson::
n
a
m
e
;
/
/
m
i
s
s
经
过
类
实
例
:
:
静
态
变
量
来
拜
访
name;//miss经过类实例::静态变量来拜访
name;//miss经过类实例::静态变量来拜访 person->say();//thisissay类实例拜访静态办法
抽象类
抽象类不能实例化,能够被其他类承继。
只要类中有一个办法是抽象办法,则该类便是抽象类。
子类承继了抽象类,子类完成父类抽象办法的拜访操控润饰符只能持平或更宽松。
接口
接口指定了完成该接口的类有必要完成的办法,在接口中不需要界说这些办法的具体完成。
接口中一切办法有必要是公有的(public).
接口能够被子接口承继。
接口中能够界说常量。
匿名内部类
匿名内部类被嵌入到普通的类中时,无法运用类的特点和办法,能够extends外部类,来运用外部类的特点和办法。
<?php classOuter { public$name=”Miss”; protected$age=10; private$code=201; publicfunctionsay() { returnnewclassextendsOuter{ publicfunctionsay() { echo"nageis".$this->age;//10 } }; } } $outer=newOuter(); $inner=$outer->say(); $inner->say(); #重载 *PHP的重载是指动态的创立类的特点和办法,与其他语言的重载(同一个办法名,不同的办法参数)不是同一个意思。 *只要调用未界说或者不行的类的特点和办法时,重载的戏法函数才会调用。 >类的不行拜访的特点的重载 <?php classPerson { private$data=[];//用来存储不行拜访的特点和值 publicfunction__set($name,$value) { $this->data[$name]=$value; } publicfunction__get($name) { if(array_key_exists($name,$this->data)) { return$this->data[$name]; } returnnull; } publicfunction__isset($name) { returnarray_key_exists($name,$this->data); } publicfunction__unset($name) { unset($this->data[$name]); } } $person=newPerson(); $person->name=“hello”; echo“nameis“.$person->name.”<br>“;//hello echo“ageis“.$person->age.”<br>“;//没有值 var_dump(isset($person->name));//true var_dump(isset($person->age));//false unset($person->name); echo“nameis“.$person->name.”<br>“;//没有值 >类的不行拜访的办法的重载 <?php classPerson { publicfunction__call($funName,$arguments) { echo“functionnameis“.$funName.”argumentsis“.join(‘,’,$arguments); } publicfunction__callStatic($funcName,$arguments) { echo"staticfunctionnameis".$funName."argumentsis".join(',',$arguments); } } $person=newPerson(); $person->say(“Miss”,”Eddy”);//functionnameissayargumentsisMiss,Eddy Person::phone(“Miss”,18811773009);//staticfunctionnameisargumentsisMiss,18811773009 #遍历目标 >目标能够运用foreach来便利特点。便利的特点为当前可见特点。 <?php classPerson { private$code=20169107; protected$age=21; public$name="Miss"; public$class=1601; publicfunctionsay() { foreach($thisas$key=>$value) { echo$key."=>".$value."<br>"; } } } $person=newPerson(); foreach($personas$key=>$value) { { echo$key.”=>”.$value.”<br>“; } } $person->say(); //输出 在目标外,只要public特点可见 name=>Miss class=>1601 在目标内,一切特点可见(不考虑承继) code=>20169107 age=>21 name=>Miss class=>1601 >完成Iterator接口 <?php classPersonimplementsIterator { private$arr=[]; publicfunction__construct($arr) { $this->arr=$arr; } publicfunctioncurrent() { $current=current($this->arr); echo“current=”.$current.”<br>“; return$current; } publicfunctionkey() { $key=key($this->arr); echo“keyis“.$key.”<br>“; return$key; } publicfunctionnext() { $next=next($this->arr); echo“nextis“.$next.”<br>“; return$next; } publicfunctionrewind() { echo“rewinding<br>“; rewind($this->arr); } publicfunctionvalid() { echo“validatingandcurrentis”.$this->current(); if($this->current()!=false) { returntrue; } returnfalse; } } $person=newPerson([12,11,10]); foreach($personas$key=>$value) { { echo$key.”=>”.$value.”<br>“; } } $person->say(); //输出 rewinding current=12 validatingandcurrentis12current=12 current=12 keyis0 0=>12 nextis11 current=11 validatingandcurrentis11current=11 current=11 keyis1 1=>11 nextis10 current=10 validatingandcurrentis10current=10 current=10 keyis2 2=>10 nextis current= validatingandcurrentiscurrent= #Final关键字 *final只能润饰类和办法,不能润饰特点。润饰类则该类无法被承继,润饰办法,则该办法无法被重写。 #目标仿制 *能够运用clone进行目标的仿制,目标的仿制为一个浅复制,一切的引证特点仍指向本来的值。 *当目标仿制完成后,假如类中有__clone戏法办法,该办法将会在新复制的目标中进行调用。 >clone的用法: <?php classInner{ public$name=”miss”; } classOuter{ public$inner; public$age=10; } $outer=newOuter(); $outer->inner=newInner(); $anoter=clone$outer; $anoter->inner->name=”eddy”; $anoter->age=20; echo$outer->age;//10 echo$outer->inner->name;//eddy *###深复制的完成方式 >运用__clone戏法办法: <?php classInner{ public$name=”miss”; } classOuter{ public$inner; public$age=10; publicfunction__clone() { $this->inner=clone$this->inner; } } $outer=newOuter(); $outer->inner=newInner(); $anoter=clone$outer; $anoter->inner->name=”eddy”; $anoter->age=20; echo$outer->age;//10 echo$outer->inner->name;//miss此处在目标内进一步复制了引证变量 >目标的序列化和反序列化: <?php classInner{ public$name=”miss”; } classOuter{ public$inner; public$age=10; } $outer=newOuter(); $outer->inner=newInner(); //$anoter=clone$outer; $serializeOuter=serialize($outer); $anoter=unserialize($serializeOuter); $anoter->inner->name=”eddy”; $anoter->age=20; echo$outer->age;//10 echo$outer->inner->name;//miss不会改变复制目标的引证变量 #目标比较 *==假如两个目标的特点和特点值持平,而且为同一个类的实例,则持平 *===假如两个目标变量指向同一个实例(目标的赋值、复制和引证),则持平。 <?php functioncompare(&$obj1,&$obj2) { echo“obj1==obj2:”.($obj1==$obj2).”<br>“; echo“obj1!=obj2:”.($obj1!=$obj2).”<br>“; echo“obj1===obj2:”.($obj1===$obj2).”<br>“; echo“obj1!==obj2:”.($obj1!==$obj2).”<br>“; } classPerson{ public$name; } $personOne=newPerson(); $personOne->name=”hello”; $personTwo=$personOne; $personThree=newPerson(); $personThree->name=”hello”; $personFour=&$personOne; echo‘<br>compare($personOne,$personTwo):<br>‘; compare($personOne,$personTwo); echo‘<br>compare($personOne,$personThree):<br>‘; compare($personOne,$personThree); echo‘<br>compare($personOne,$personFour):<br>‘; compare($personOne,$personFour); //输出 compare($personOne,$personTwo): obj1==obj2:1 obj1!=obj2: obj1===obj2:1 obj1!==obj2: compare($personOne,$personThree): obj1==obj2:1 obj1!=obj2: obj1===obj2: obj1!==obj2:1 compare($personOne,$personFour): obj1==obj2:1 obj1!=obj2: obj1===obj2:1 obj1!==obj2: #类型束缚 [类型束缚具体介绍](https://segmentfault.com/a/1190000007226476) #后期静态绑定 [后期静态绑定具体介绍](https://www.jb51.net/article/136794.htm) #目标和引证 *php的引证便是另取了一个别号,两个不同的变量称号指向相同的内容。 *当目标作为参数传递、回来和赋值给另一个变量时,这些都不是目标的引证,仅仅他们都保存这一个和本来目标相同标识符的复制。 <?php classPerson{ public$name; } classHero{ public$name; } $personOne=newPerson(); $personOne->name="Miss"; $personTwo=$personOne; $personTwo->name="eddy"; echo$personOne->name;//eddy functiongetAnoter($person) { $person->name="eddy"; } getAnoter($personOne); echo$personOne->name;//eddy functiongetCopy($person) { $person=newHero(); $person->name="Jack"; return$person; } $hero=getCopy($personOne); echo$hero->name.'<br>';//hero echo$personOne->name;//Miss functiongetRef(&$person) { $person=newHero(); $person->name="Jack"; return$person; } $hero=getRef($personOne); echo$hero->name.'<br>';//Jack echo$personOne->name;//Jack
目标序列化
序列化目标,能够运用serialize()函数回来的一个字符串来表明。序列化目标将会保存目标一切的变量、类的称号,可是不会保存目标的办法、类的常量、静态变量。
反序列化,能够运用unserialize(),可是这个目标应在反序列化之前界说。因而当在另一个文件中反序列化目标时,能够经过include或require引进包含该类的文件文件或者运用
spl_autoload_register()来完成。
sleep和wakeup戏法办法
能够运用sleep()和wakeup()戏法办法,对序列化和反序列化事情挂钩子。还能够运用__sleep()办法序列号目标的部分变量。
__wakeup
unserialize在反序列化之前,会查看类中是否存在一个__wakeup的办法,如存在会优先调用。
__sleep
同理,在序列化之前,调用__sleep办法,该办法回来一个包含目标应该被序列化的特点的数组。关于较大的目标,该办法能够将目标部分保存。
classPerson{
public
n
a
m
e
;
p
u
b
l
i
c
name; public
name; publicyear;
privateKaTeX parse error: Expected group after '_' at position 22: … publicfunction_̲_wakeup() { …name)
{
t
h
i
s
−
>
n
a
m
e
=
this->name=
this−>name=name;
}
}
PHP面向对象
最新推荐文章于 2024-09-10 14:26:18 发布