中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP系列(四)PHP面向對象程序設計

發布時間:2020-07-06 17:02:44 來源:網絡 閱讀:452 作者:sswqzx 欄目:web開發

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,我的性別:我的學校是:上海交通大學

?

?

7Php常見的關鍵字

?

Instanceof 操作符用于檢測當前對象實例是否屬于某一個類的類型

If($p instanceof Person){

???????? Echo“這個$pPerson類的對象”;

}else{

???????? Echo“對象不屬于這個類”;

}

?

Final 用于類方法名前、不能修飾成員屬性

1final可以修飾類、這個類不能擴展、不能有子類、這個類是最終類

2final可以修飾方法、這個方法、就不能在子類中覆蓋、不能讓子類來改這個方法、或擴展這個方法、這個方法也是最終方法。

?

Static ?可以修飾屬性和方法、不能修飾類

1)使用static修飾成員屬性、存在內存的初始化表態段

2)可以被所有同一個類的對象共用

3)第一個用到類、類在加載到內存時、就已經將靜態的成員加到了內存

對象->成員

類::成員

4)靜態的成員一定要使用類來訪問(靜態成員不可以由對象通過->操作符來訪問)

5self可以在類中的方法中、代表自已類的($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

?

8php魔術方法

__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 “串行化nameage”;

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

?????????????????? }

???????? }

?

9php抽象方法和抽象類

?

抽象方法:

(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();

?微信掃一掃?、關注公眾號

?? 不定時分享資料視頻

PHP系列(四)PHP面向對象程序設計


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永和县| 古田县| 盐源县| 乌拉特前旗| 如东县| 阿尔山市| 建湖县| 平陆县| 岑巩县| 陕西省| 益阳市| 磐安县| 精河县| 信宜市| 霍州市| 通许县| 通海县| 巴林左旗| 南丹县| 日喀则市| 寿光市| 象山县| 砀山县| 林口县| 德化县| 上高县| 修水县| 娄底市| 崇仁县| 庆安县| 辛集市| 萨嘎县| 桂阳县| 阜新市| 新宾| 日土县| 井研县| 惠东县| 廊坊市| 泸定县| 霍山县|