您好,登錄后才能下訂單哦!
php面向對象程序設計
面向對象的優勢:可讀性、可重用性、穩定性、維護性、可測試性
簡單格式:
[修飾符]class 類名{
???????? [成員屬性]
???????? [成員方法]
}
完整格式:
[修飾符]class?類名 [extends 父類]? [implements 接口 ] {
???????? [成員屬性]
???????? [成員方法]
}
成員方法格式:
[修飾符] function 方法名(參數){
???????? [方法體]
???????? [return返回值]
}
修飾符:public? protected? private?static? abstract? final
$對象名稱=new 類名稱();
$引用名=new 類名(構造函數)
$引用名->成員屬性=賦值
$引用名->成員方法(參數)
?
class student{
???????? public$name = "ssw";
???????? public$age = "20";
?
???????? publicfunction study($num,$yum){
?????????????????? return"學習成功";
???????? }
}
$s = new student();
echo $s->name;
echo $s->age;
$s->study();
?
?
1、特殊的對象引用 $this(代表對象的一個引用)
class Person{
???????? public $name;
???????? public $sex;
???????? public function say(){
?????????????????? echo "我的名子:".$this->name."性別:".$this->sex;
???????? }
}
$p = new Person();
$p -> name = ssw;
$p -> sex =male;
$p -> say();
顯示為:我的名子:ssw性別:male
?
2、構造方法
(1)是對象創建完成以后、第一個自動調用的方法
(2)方法名比較特殊、可以和類名相同名的方法名、
(3)作用:給對象中的成員屬性賦初值
class Person{
???????? public$name;
???????? public$sex;
???????? public$age;
???????? publicfunction Person($n,$s,$a="25"){
?????????????????? $this->name=$n;
?????????????????? $this->sex=$s;
?????????????????? $this->age=$a;
????????
???????? }
???????? publicfunction say(){
?????????????????? echo"我的名子:".$this->name."性別:".$this->sex."年齡:".$this->age;
???????? }
}
$p = new Person(ssw,male,22);
$p1 = new Person(ssw,male);
$p -> say();
顯示為:我的名子:ssw性別:male年齡:22
?
classPerson{
???????? public $name;
???????? public $sex;
???????? public $age;
/*
???????? public functionPerson($n,$s,$a="25"){
?????????????????? $this->name=$n;
?????????????????? $this->sex=$s;
?????????????????? $this->age=$a;
????????
???????? }
*/
???????? public function__construct($n,$s,$a="25"){
?????????????????? $this->name=$n;
?????????????????? $this->sex=$s;
?????????????????? $this->age=$a;
????????
???????? }
???????? public function say(){
?????????????????? echo "我的名子:".$this->name."性別:".$this->sex."年齡:".$this->age;
???????? }
}
$p= new Person(ssw,male,22);
$p1= new Person(ssw,male);
$p-> say();
顯示為:我的名子:ssw性別:male年齡:22
?
?
3、析構函數
對象釋放前調用、沒有參數、__destruct
classPerson{
???????? public $name;
???????? public $sex;
???????? public $age;
???????? public function__construct($n,$s,$a="25"){
?????????????????? $this->name=$n;
?????????????????? $this->sex=$s;
?????????????????? $this->age=$a;
???????? }
???????? public function say(){
?????????????????? echo "我的名子:".$this->name."性別:".$this->sex."年齡:".$this->age;
???????? }
???????? function __destruct(){
?????????????????? echo "{$this->name}再見!<br>";
???????? }
}
$p= new Person(ssw,male,22);
$p1= new Person(qzx,male);
顯示為:($p在內存中存儲為棧。New Person()在內中存儲為堆)
qzx再見!
ssw再見!
?
封裝繼承多態
?
4、類的封裝性
方法的封裝:
(1)、Public()公共的:能在程序的任意地方引用!類內類外都可以引用!
(2)、Protected()保護的:聲明的類內能用,繼承類能引用!
(3)、Private() 私有的:只能在本類內調用
?
classPerson{
???????? private $name;
???????? private $age;
???????? private $sex;
???????? function__construct($name="", $age=0, $sex="男"){
?????????????????? $this->name=$name;
?????????????????? $this->age=$age;
?????????????????? $this->sex=$sex;
???????? }
???????? function getAge(){
?????????????????? if($this->age < 20){
??????????????????????????? return$this->age;
?????????????????? }else if($this->age <30){
??????????????????????????? return $this->age- 5;
?????????????????? }else{
??????????????????????????? return 29;
?????????????????? }
???????? }
?
???????? function __destruct(){
?????????????????? echo "再見:".$this->name;
???????? }
}
$p1= new Person("ssw", 80, "女");
echo$p1->getAge();
顯示為:29再見:ssw
?
?
5、魔術方法
__get? 獲取類中私有屬性值的時候、自動調用的方法
自動調用、是在直接訪問私有成員時、自動調用
classPerson{
???????? private $name;
???????? private $age;
???????? private $sex;
function__get($a){
???????? echo $a."get";
}
}
$p1= new Person("ssw", 80, "女");
$p1->name."<br>";
$p1->age;
顯示為:name####age####
?
classPerson{
???????? private $name;
???????? private $age;
???????? private $sex;
function__construct($name="", $age=0, $sex="男"){
??????????????????????????? $this->name =$name;
??????????????????????????? $this->age =$age;
??????????????????????????? $this->sex =$sex;
?????????????????? }
function__get($a){
???????? echo $this->$a."##";
???????? }
}
$p1= new Person("ssw", 80, "女");
$p1->name;
$p1->age;
$p1->sex;
顯示為:ssw##80##女##
?
__set 為類中私有屬性賦值的時候、自動調用的方法
自動調用、是在直接設置私有屬性值時、二個參數
class Person{
???????? private $name;
???????? private $age;
???????? private $sex;
function__construct($name="", $age=0, $sex="男"){
??????????????????????????? $this->name = $name;
??????????????????????????? $this->age = $age;
??????????????????????????? $this->sex = $sex;
?????????????????? }
function __set($n,$v){
???????? echo $n."=".$v;
???????? echo "<br>";
???????? echo $this->$n=$v;
}
}
$p1 = newPerson("ssw", 80, "女");
$p1->name="王子";
顯示為:name=王子王子
class Person{
???????? private $name;
???????? private $age;
???????? private $sex;
?
function__construct($name="", $age=0, $sex="男"){
??????????????????????????? $this->name = $name;
??????????????????????????? $this->age = $age;
??????????????????????????? $this->sex = $sex;
?????????????????? }
?
function __set($n,$v){
???????? if($n=="age"){
?????????????????? if($v < 0 or $v > 100)
??????????????????????????? return;
?????????????????? }
???????? $this->$n = $v;
???????? }
?
function __get($pre){
???????? return $this->$pre;
???????? }
?
}
$p1 = newPerson("ssw", 80, "女");
$p1->name="王子";
$p1->age=109;
$p1->sex="女";
echo $p1->name;
echo $p1->sex;
echo $p1->age;//echo $p1->__get("age");__get不是私有的、外部可以通過對象來調用
顯示為:王子女80
?
__isset()??判斷類中私有屬性是否存在時、自動調用的方法
?isset()在使用isset判斷一個私有屬性是否存在時、自動調用__isset()魔術方法、參數則是屬性名稱
class Person{
???????? private$name;
???????? private$age;
???????? private$sex;
???????? function__construct($name="",$age=0,$sex="男"){
?????????????????? $this->name=$name;
?????????????????? $this->age=$age;
?????????????????? $this->sex=$sex;
???????? }
???????? function__isset($Pro){
?????????????????? if($Pro=="age")
??????????????????????????? returnfalse;
?????????????????? returnisset($this->$Pro);
???????? }
}
$p = new Person("ssw",29,"男");
if(isset($p->name)){
???????? echo"這個對象中的name是存在的屬性";
}else{
???????? echo"對象p中不存在name值";
}
顯示為:這個對象中的name是存在的屬性
?
__unset? 銷毀類中私有成員時、自動調用的方法
class Person{
???????? private$name;
???????? private$age;
???????? private$sex;
?
???????? function__construct($name="",$age=0,$sex="男"){
?????????????????? $this->name=$name;
?????????????????? $this->age=$age;
?????????????????? $this->sex=$sex;
???????? }
?
???????? function__isset($Pro){
?????????????????? if($Pro=="age")
??????????????????????????? returnfalse;
?????????????????? returnisset($this->$Pro);
???????? }
?
???????? function__unset($Pro){
?????????????????? if($Pro!="age"){
??????????????????????????? unset($this->$Pro);
?????????????????? }
???????? }
}
?
$p = new Person("ssw",29,"男");
unset($p->name);
if(isset($p->name)){
???????? echo"這個對象中的name是存在的屬性";
}else{
???????? echo"對象p中不存在name值";
}
顯示為:對象p中不存在name值
?
?
6、類的繼承性
類的繼承訪問控制:
(1)、子類使用extends繼承父類、子類可以將父類中所有的內容都繼承過來
(2)、private 私有的權限、只能自已類里用、不能在別的類中用、包括自已的子類
(3)、protected 保護的權限、只能是自已類和自已子類中使用、不能在類外面使用
(4)、public 公有的權限、所有都可以、自已、子類、類外部都可以使用
class Person{
???????? public$name;
???????? protected$age;
???????? private$sex;
???????? function__construct($name, $age, $sex){
?????????????????? $this->name= $name;
?????????????????? $this->age= $age;
?????????????????? $this->sex= $sex;
???????? }
???????? publicfunction say(){
?????????????????? echo"我的性別:{$this->sex}";
???????? }
???????? publicfunction eat(){
???????? }
}
?
class Student extends Person{
???????? var$school;
???????? functionstudy(){??????
???????? }
}
?
class Teacher extends Student{
???????? var$gz;
???????? functionjiao(){
?????????????????? echo"我的年齡是:".$this->age;
???????? }
}
$t = new Teacher("ssw",30,"男");
echo $t -> name;
$t -> jiao();
$t -> say();
顯示為:ssw我的年齡是:30我的性別:男
?
繼承中的重載(覆蓋)--在子類中可以重寫父類同名的方法(方法也可以拓展)
對象->成員
類::成員
Parent::成員? 使用用parent::訪問父類中被覆蓋的方法
重要:只要是子類的構造方法、去覆蓋父類中的構造方法、一定要在子類的最上面調用一下父類被覆蓋的方法
權限問題:子類只能大于或等于父類的權限、不能小于
?
class Person{? //使用用parent::訪問父類中被覆蓋的方法
???????? public$name;
???????? protected$age;
???????? protected$sex;
?
???????? function__construct($name, $age, $sex){
?????????????????? $this->name= $name;
?????????????????? $this->age= $age;
?????????????????? $this->sex= $sex;
???????? }
?
???????? publicfunction say(){
?????????????????? echo"我的名子:{$this->name},我的年齡是:{$this->age},我的性別:{$this->sex} <br>";
???????? }
}
?
class Student extends Person{
???????? var$school="jtuniverty!";
???????? functionsay(){
//????? echo"我的名子:{$this->name},我的年齡是:{$this->age},我的性別:{$this->sex} <br>";
//????? Person::say();
???????? parent::say();//這三個是一樣的!
???????? echo"我的學校是:{$this->school}";
???????? }
}
$p = new Student("ssw", 28,"男");
$p -> say();
顯示為:我的名子:ssw,我的年齡是:28,我的性別:男我的學校是:jtuniverty!
?
class Person{? //子類的構造方法、去覆蓋父類中的構造方法
???????? public$name;
???????? protected$age;
???????? protected$sex;
?
???????? function__construct($name, $age, $sex){
?????????????????? $this->name= $name;
?????????????????? $this->age= $age;
?????????????????? $this->sex= $sex;
???????? }
?
???????? publicfunction say(){
?????????????????? echo"我的名子:{$this->name},我的年齡是:{$this->age},我的性別:{$this->sex} ";
???????? }
}
class Student extends Person{
???????? var$school;
?
???????? function__construct($name, $age, $sex, $school){
?????????????????? parent::__construct($name,$age, $sex);
?????????????????? $this->school= $school;
???????? }
?
???????? functionsay(){
???????? parent::say();//這三個是一樣的!
???????? echo"我的學校是:{$this->school}";
???????? }
}
?
$p = new Student("ssw", 28,"男", "上海交通大學");
$p -> say();
顯示為:我的名子:ssw,我的年齡是:28,我的性別:男我的學校是:上海交通大學
?
?
7、Php常見的關鍵字
?
Instanceof 操作符用于檢測當前對象實例是否屬于某一個類的類型
If($p instanceof Person){
???????? Echo“這個$p是Person類的對象”;
}else{
???????? Echo“對象不屬于這個類”;
}
?
Final 用于類方法名前、不能修飾成員屬性
(1)final可以修飾類、這個類不能擴展、不能有子類、這個類是最終類
(2)final可以修飾方法、這個方法、就不能在子類中覆蓋、不能讓子類來改這個方法、或擴展這個方法、這個方法也是最終方法。
?
Static ?可以修飾屬性和方法、不能修飾類
(1)使用static修飾成員屬性、存在內存的初始化表態段
(2)可以被所有同一個類的對象共用
(3)第一個用到類、類在加載到內存時、就已經將靜態的成員加到了內存
對象->成員
類::成員
(4)靜態的成員一定要使用類來訪問(靜態成員不可以由對象通過->操作符來訪問)
(5)self可以在類中的方法中、代表自已類的($this)。子類用parent::靜態名
(6)靜態成員一但被加載、只有腳本結束才釋放
(7)在靜態的方法中、是不能訪問非靜態的成員的
(8)只要是能使用靜態的環境下聲明方法、就最好使用靜態方法(效率)
class Foo
{
???public static $my_static = 'foo';
?
???public function staticValue() {
???????return self::$my_static;
??? }
}
?
class Bar extends Foo
{
???public function fooStatic() {
???????return parent::$my_static;
??? }
}
?
print Foo::$my_static . "\n";
?
$foo = new Foo();
print $foo->staticValue() ."\n";
//print $foo->my_static ."\n";????? // Undefined"Property" my_static
?
//print $foo::$my_static . "\n";
//$classname = 'Foo';
//print $classname::$my_static ."\n"; // PHP 5.3.0之后可以動態調用
?
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() ."\n";
顯示為:foofoo foo foo
?
單態設計模式
單態(單例、單件)
(1)如果想讓一個類、只能有一個對象、就要先讓這個類、不能創建對象、將構造方法private
(2)可以在類的內存使用一個方法、來創建對象
class Person{
???????? static $obj = null;
???????? static function getObj(){
//如果第一次調用時、沒有對象則創建、以后調用時、直接使用第一次創建的對象
?????????????????? if(is_null(self::$obj)){
??????????????????????????? self::$obj = newself;
?????????????????? }
?????????????????? return self::$obj;
???????? }
????????
???????? function __destruct(){
???????? echo "####";
???????? }
???????? function say(){
?????????????????? echo "say";
???????? }
}
$p =Person::getObj();
$p ->say();
顯示為:say####
?
Const(類常量)修飾的成員屬性為常量、只能修飾成員屬性
類中:
(1)常量建議用大寫、不能使用$
(2)常量一定要在聲明時就給好初值
(3)常量的訪問方式和static的訪問方式相同、但只能讀
在類外部使用類名::常量名
在類內部使用 self::常量名
class MyClass
{
??? const constant = 'cv';
?
??? function showConstant() {
??????? echo?self::constant . "\n";
??? }
}
?
echoMyClass::constant . "\n";
?
//$classname ="MyClass";
//echo$classname::constant . "\n"; // PHP 5.3.0之后
?
$class = newMyClass();
$class->showConstant();
?
//echo$class::constant."\n"; // PHP 5.3.0之后
顯示為:cv cv
?
8、php魔術方法
__construct()? __destruct()?__set()?? __get()?? __isset()??__unset()
__tostring()
(1)直接使用 echo print printf輸出一個對象引用時、自動調用這個方法
(2)將對象的基本信息放在__toString()方法內部、形成字符串返回
(3)__toString()方法中、不能有參數、而且必須返回一個字符串
class test{
???????? private $foo;
???????? public function __construct($foo){
?????????????????? $this->foo = $foo;
???????? }
???????? public function __toString(){
?????????????????? return $this->foo;
???????? }
}
?
$p = newtest("ssw");
echo $p;
顯示為:ssw
?
克隆對象__clone()方法
克隆對象:
(1)使用clone這個關鍵字復制一個對象
__clone()魔術方法:
(1)是在克隆對象時、自動調用的方法
(2)作用:和構造方法一樣、是對新克隆的對象進行初使化
(3)在這個__clone()方法中$this代表的是副本、所以就可以給所有副本的成員初始化
class Person{
???????? public $name;
???????? public $age;
???????? public $sex;
?
???????? function __construct($name,$age,$sex){
?????????????????? $this->name = $name;
?????????????????? $this->age = $age;
?????????????????? $this->sex = $sex;
???????? }
???????? function say(){
?????????????????? echo "名子:{$this->name},年齡:{$this->age},性別:{$this->sex}";
???????? }
???????? function __destruct(){
???????? }
???????? function __clone(){
?????????????????? $this->name="克隆的";
?????????????????? $this->age=2;
???????? }
}
$p = newPerson("ssw", 22, "男");
$p->say();
echo"<br>";
$p2=clone $p;
$p2->name="www";
$p2->say();
顯示為:
名子:ssw,年齡:22,性別:男
名子:www,年齡:2,性別:男
?
__call()魔術方法:
(1)在調用一個對象中不存的方法時、自動調用__call方法
(2)有二個參數、第一個參數是、調用的不存在的方法的方法名、第二個參數、調用這個不存在的方法名的方法參數、
(3)作用:可以寫提示、但這個不是主要的功能、將方法的功能相似、但方法名不同的、就可以用這個方式來完成
class Person{
???????? public $name;
???????? public $age;
???????? public $sex;
?
???????? public $marr = array("say","run", "eat");
?
???????? function __call($method,$args){
?????????????????? if(in_array($method,$this->marr)){
??????????????????????????? echo$args['0']."<br>";
?????????????????? }else{
??????????????????????????? echo "你調用的方法{$method}()不存在<br>";
?????????????????? }
???????? }
?
???????? function __construct($name,$age,$sex){
?????????????????? $this->name = $name;
?????????????????? $this->age = $age;
?????????????????? $this->sex = $sex;
???????? }
}
?
$p = newPerson();
$p->say("sss");
$p->run("rrr");
$p->eat("eee");
$p->ww("www");
顯示為:sss? rrr? eee你調用的方法ww()不存在
?
對象串行化
$p=newPerson();//聲明一個對象
$str=serialize($p);//將對象串行化
File_put_contents(“objstr.txt”,$str);//將字符串保存在文件objstr.txt中
——————————
讀出字符串從文件中、返串行化
$str=file_get_contents(“objstr.txt”);
$p =unserialize($str);
$p->say();
__sleep() 在串行化時自動調用方法
作用:可以設置需要串行化的對象屬性
只要在這個方法中、返回一個數、在數組中聲明了那個屬性、那個屬性就會被串行化、沒有在這個數組中的就不被串行化、默認這個方法、全部屬性都串行化、
?
__wakeup() 在返串行化時自動調用的方法
作用:對象串行化回來的對象、進行初始化,用的和下面二個方法作用相似
__construct()
__clone()
?
Function __sleep(){
???????? Echo “串行化name和age”;
???????? Return array(“name”,”age”);
}
Function __wakeup(){
???????? Echo “返串行化時自動調用這個方法”;
???????? $this->age=12;
}
?
數組串行化
Json_encode串行化
Json_decode返串行化
$arr =array("name"=>"ssw", "age"=>10,"sex"=>"男");
?
//串行化
$str =json_encode($arr);
?
//返串行化、第二個參數true返串行化為數組(無第二個參數為對象 )
$parr =json_decode($str, true);
echo$parr['name'];
顯示為:ssw
?
魔術方法__set_state()
(1)、eval()函數、檢查并執行php代碼
$arr ="echo 'ss';";
echo $arr;
eval($arr);
顯示為:echo 'ss';? ss
?
(2)var_export()返回傳遞給該函數的變量的結構信息(和var_dump類似)
返回合法的php代碼、可以直接當作php代碼賦值一個變量
?? $arr = array ( "apple" ,"banana" , "orange" );
??? var_export ( $arr );
顯示為:array ( 0 => 'apple', 1=> 'banana', 2 => 'orange', )
?
__set_state()方法、就是在使用var_export()方法時、導出一個類的信息時自動調用的方法
輸出內容以該魔術方法的返回值為準。__set_state()必須的為靜態(static)函數、參數必為數組。
?
class Person{
???????? public $name;
???????? public $age;
???????? public $sex;
???????? function __construct($name, $age,$sex){
?????????????????? $this->name = $name;
?????????????????? $this->age = $age;
?????????????????? $this->sex = $sex;
???????? }
???????? static function __set_state($arr){
??????????????????????????? print_r($arr);
??????????????????????????? echo"<br>";
??????????????????????????? $p = newPerson("李靜", 20, "女");
??????????????????
??????????????????????????? return $p;
?????????????????? }
}
?
$p = newPerson("ss", 39, "女");
?
//$p ->name = "111";
//$p -> age= 30;
?
eval('$b='.var_export($p, true).";");
var_dump($b);
顯示為:
Array( [name] => ss [age] => 39 [sex] => 女 )?
object(Person)#2 (3) { ["name"]=> string(6) "李靜"["age"]=> int(20) ["sex"]=> string(3) "女"}
?
class Person{
???????? public $name;
???????? public $age;
???????? public $sex;
???????? function __construct($name, $age,$sex){
?????????????????? $this->name = $name;
?????????????????? $this->age = $age;
?????????????????? $this->sex = $sex;
???????? }
???????? static function __set_state($arr){
??????????????????????????? //print_r($arr);
????????
??????????????????????????? $p = newPerson("李靜", 20, "女");
??????????????????????????? $p->name=$arr['name'];
??????????????????????????? $p->age=$arr['age'];
??????????????????????????? return $p;
?????????????????? }
}
?
$p = newPerson("ss", 39, "女");
?
$p -> name= "111";
$p -> age =30;
?
eval('$b='.var_export($p, true).";");
var_dump($b);
顯示為:object(Person)#2 (3) {["name"]=> string(3) "111" ["age"]=>int(30) ["sex"]=> string(3) "女" }
?
Php5.3以后新的魔術方法
__invoke()在創建實例后、可以直接調用對象
class Person{
???????? public $name;
???????? public $age;
???????? public $sex;
???????? function __construct($name, $age,$sex){
?????????????????? $this->name = $name;
?????????????????? $this->age = $age;
?????????????????? $this->sex = $sex;
???????? }
?
?????????????????? function __invoke($a,$b,$c){
??????????????????????????? echo "在對象引用后加上()調用時自動調用這個方法{$a}{$b}{$c}";
?????????????????? }
}
$p = newPerson("ss", 39, "女");
$p(1,2,3);
顯示為:在對象引用后加上()調用時自動調用這個方法123
?
__callstatic()調用不存的在靜態方法時、自動調用這個函數
class Person{
???????? public $name;
???????? public $age;
???????? public $sex;
???????? function __construct($name, $age,$sex){
?????????????????? $this->name = $name;
?????????????????? $this->age = $age;
?????????????????? $this->sex = $sex;
???????? }
?????????????????? static function__callstatic($method, $args){
??????????????????????????? echo "你調用的靜態方法 $method(".implode(".",$args).")不存在";
?????????????????? }
}
$p = newPerson("ss", 39, "女");
Person::hello(1,2,3);
顯示為:你調用的靜態方法 hello(1.2.3)不存在
?
__autoload 只要在這個腳本中、需要加載類的時候(必須用到類名)、就自動調用這個方法
function__autoload($classname){
???????? echo $classname."<br>";
???????? includestrtolower($classname).".class.php";
}
$t = newTest();
$t ->one();
顯示為:Test? ttt
類文件
test.class.php
???????? class Test{
????????
???????? public $name;
?
???????? public function one(){
?????????????????? echo "ttt";
?????????????????? }
???????? }
?
9、php抽象方法和抽象類
?
抽象方法:
(1)????????聲明一個方法、沒有方法體(就是不能有{})、而且直接分號結束
(2)????????如果是抽象方法、必須使用abstract(抽象關鍵詞來修飾)
(3)????????除了抽象類中可以有抽象方法、以外、和正常的類完全一樣
?
抽象類:
(1)????????如果類中有一個方法為抽象方法、這個類就是抽象類
(2)????????如果聲明一個抽象類、這個類必須要使用abstract關鍵字來修飾
(3)????????抽象類不能創建對象、必須寫這個類的子類、將抽象類中的抽象的方法覆蓋(加上方法體)
(4)???????? 子類必須全部實(覆蓋重寫)抽象方法、這個類才能創建對象、如果只實現部分、那么還有抽象方法、則類也就必須是抽象類
抽象方法作用:
抽象方法的作用就是規定了、子類必須有這個方法的實現、功能交給子類。
只寫出來結構、而沒有實現、實現交給具體的子類(按自已的功能)去實現。
抽象類的作用:
就是要求子類的結構規范、所以抽象類就是一個規范
abstract classAbstractClass
{
?// 強制要求子類定義這些方法
??? abstract protected function getValue();
??? abstract protected functionprefixValue($prefix);
?
??? // 普通方法(非抽象方法)
??? public function printOut() {
??????? print $this->getValue() ."\n";
??? }
}
?
classConcreteClass1 extends AbstractClass
{
??? protected function getValue() {
??????? return "ConcreteClass1";
??? }
?
??? public function prefixValue($prefix) {
??????? return"{$prefix}ConcreteClass1";
??? }
}
?
classConcreteClass2 extends AbstractClass
{
??? public function getValue() {
??????? return "ConcreteClass2";
??? }
?
??? public function prefixValue($prefix) {
??????? return"{$prefix}ConcreteClass2";
??? }
}
?
$class1 = newConcreteClass1;
$class1->printOut();
echo$class1->prefixValue('FOO_') ."\n";
?
$class2 = newConcreteClass2;
$class2->printOut();
echo$class2->prefixValue('FOO_') ."\n";
顯示為:ConcreteClass1FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
?
10、PHP接口
抽象類是一種抽象的類、接口是一種特殊的抽象類、接口也是一種特殊特殊的類
(1)????????抽象類和接口都有抽象方法
(2)????????抽象類和接口都不能創建實例對象
(3)????????抽象類和接口的使用意義也就是作用相同
接口和抽象類相比、特殊在哪里:
(1)????????接口中的方法、必須全部是抽象方法(不能用不抽象的方法)所有在接口中的抽象方法不需要使用abstract、直接使用分號結束即可。
(2)????????接口中的成員屬性、必須是常量、(不能是變量)接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋
(3)????????所有的權限必須是公有的(public)
(4)????????聲明接口不使用class、而是使用interface
(5)????????接口也可以繼承、通過extends操作符
(6)????????可以使用一個類來實現接口中的全部方法、也可以使用一個抽象類、來實現接口中的部分方法
(7)????????類或抽象類實現一個接口用implements關鍵字操作。
// 聲明一個'iTemplate'接口
interfaceiTemplate{
??? public function setVariable($name, $var);
??? public function getHtml($template);
}
// 實現接口
class Templateimplements iTemplate{
??? private $vars = array();
??? public function setVariable($name, $var){
??????? $this->vars[$name] = $var;
??? }
??? public function getHtml($template) {
??????? return $template;
??? }
}
?
//接口也可以繼承、通過extends操作符
interface a{
??? public function foo();
}
interface bextends a{
??? public function baz(Baz $baz);
}
Class world {
???????? Function test(){}
}
// 正確寫法
class cextents world implements b{
??? public function foo(){
??? }
publicfunction baz(Baz $baz){
??? }
}
//接口繼承多個接口、然后類來實現在
interface a{
??? public function foo();
}
interface b{
??? public function bar();
}
interfacec extends a, b{
??? public function baz();
}
class dimplements c{
??? public function foo(){
??? }
??? public function bar(){
??? }
??? public function baz(){
??? }
}
?
接口常量(和類常量用法一樣)
interface a{
??? const b = 'Interface constant';
}
// 輸出接口常量
echo a::b;
顯示為:Interface constant
?
PHP多態
???????? interface USB {
?????????????????? const WIDTH = 12;
?????????????????? const HEIGHT = 3;?????
?????????????????? function load();
?????????????????? function run();
?????????????????? function stop();???
???????? }
???????? class Cumputer {
?????????????????? function useUSB(USB $usb) {
??????????????????????????? $usb -> load();
??????????????????????????? $usb -> run();
??????????????????????????? $usb -> stop();?????????????
?????????????????? }
???????? }
???????? class Mouse implements USB{
?????????????????? function load() {
??????????????????????????? echo "加載鼠標成功!<br>";
?????????????????? }
?????????????????? function run() {
??????????????????????????? echo "運行鼠標功能!<br>";
?????????????????? }
?????????????????? function stop() {
??????????????????????????? echo "鼠標工作結束!<br>";
?????????????????? }
???????? }
???????? class KeyPress implements USB {
?????????????????? function load() {
??????????????????????????? echo "加載鍵盤成功!<br>";
?????????????????? }
?????????????????? function run() {
??????????????????????????? echo "運行鍵盤成功!<br>";
?????????????????? }
?????????????????? function stop() {
??????????????????????????? echo "停止鍵盤使用!<br>";
?????????????????? }
???????? }
???????? class Worker {
?????????????????? function work() {
??????????????????????????? $c = new Cumputer();
???????????????????????????
??????????????????????????? $m = new Mouse;
?
??????????????????????????? $k = new KeyPress;
?
??????????????????????????? $c->useUSB($k);
??????????????????????????? $c->useUSB($m);
?????????????????? }
???????? }
???????? $w = new Worker;
???????? $w -> work();
顯示為:
加載鍵盤成功!
運行鍵盤成功!
停止鍵盤使用!
加載鼠標成功!
運行鼠標功能!
鼠標工作結束!
?
與類有關的魔術常量和函數
__LINE__ | 文件中的當前行號。 |
__FILE__ | 文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。自 ?PHP 4.0.2 起,__FILE__ ?總是包含一個絕對路徑(如果是符號連接,則是解析后的絕對路徑),而在此之前的版本有時會包含一個相對路徑。 |
__DIR__ | 文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。它等價于 ?dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。(PHP ?5.3.0中新增) ?= |
__FUNCTION__ | 函數名稱(PHP ?4.3.0 新加)。自 ?PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 ?PHP 4 中該值總是小寫字母的。 |
__CLASS__ | 類的名稱(PHP ?4.3.0 新加)。自 ?PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 ?PHP 4 中該值總是小寫字母的。 |
__METHOD__ | 類的方法名(PHP ?5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。 |
__NAMESPACE__ | 當前命名空間的名稱(大小寫敏感)。這個常量是在編譯時定義的 |
?
class_alias— Creates an alias for a class
class_exists— 檢查類是否已定義
get_called_class— the "Late Static Binding" class name
get_class_methods— 返回由類的方法名組成的數組
get_class_vars— 返回由類的默認屬性組成的數組
get_class— 返回對象的類名
get_declared_classes— 返回由已定義類的名字所組成的數組
get_declared_interfaces— 返回一個數組包含所有已聲明的接口
get_declared_traits— Returns an array of all declared traits
get_object_vars— 返回由對象屬性組成的關聯數組
get_parent_class— 返回對象或類的父類名
interface_exists— 檢查接口是否已被定義
is_a— 如果對象屬于該類或該類是此對象的父類則返回 TRUE
is_subclass_of— 如果此對象是該類的子類,則返回 TRUE
method_exists— 檢查類的方法是否存在
property_exists— 檢查對象或類是否具有該屬性
?
?
11、命名空間
(1)、任意合法的php代碼都可以包含在命名空間中、但只有三種類型的代碼受命名空間的影響、類、函數、和常量。命令空間通過關鍵字 namespace 命名空間名來聲明、必須要其它所有代碼之前聲明
(2)、定義多個名子空間、以最后一個為主
(3)、在實際編程實踐中、非常不提倡在同一個文件中定義多個命名空間、不要在大括號外面加任何代碼
Namespace? myname{}
Namespace mn1;
?
?
Namespace? hello\world;
???????? Function demo(){
???????? Echo “1111”;}
Demo();
\hello\world\demo();
Namespace\demo();
Echo__NAMESPACE__;
?
命名空間別名:
Namespacenet\lamp\www;
Use? net\lamp\www as lamp;
Function demo(){
???????? Echo “111”;
}
Lamp\demo();
?微信掃一掃?、關注公眾號
?? 不定時分享資料視頻
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。