2018-3-5 面向對象
今天學習了有關“面向對象”的內容:
傳統的面向對象:把將要完成的工作,一個步驟一個步驟的實現,最終完成目標。
現代的面向對象:把要做的事情提前存起來,等到需要用的時候調用,相當於設計方法和方法的調用。
面向對象主要是設計思想上的極大提升。面向過程是解決簡單問題的自然的思維過程,面向對象是解決大規模的復雜問題的良好思想。
面向對象的基本概念:
類:表示一個群體。有“共同特征”,某一類事物的總稱。
對象:表示群體中的個體,萬事萬物皆為對象。
1、定義類:
定義類的語法中,包括定義屬性、定義方法、定義常量三種。
2、創建類的對象:
3、使用對象:
//定義類
class c1{ var $name="匿名"; var $sex="未知"; var $age=18; function f1(){ echo "函數f1被調用!"; } const pi=3.14; }
//創建類的對象 $person1=new c1(); $person2=new c1(); $person1->name="張三"; $person1->sex="男"; $str1=$person1->name; echo "{$str1}的性別為:".$person1->sex."<br />"; $person1->f1();
創建對象的基本形式:
①$對象名1=new 類名();
②可變類名:
$CName="C1"; $person3=new $CName(); //可變類(名)
③$對象名3 = new self; //self指代類本身,這行代碼只能在類內部方法中使用。
④通過對象創建對象
$person4=new $person3; //通過對象創建該類的新對象
對象的傳值:
php中,傳值方式有值傳遞和引用傳遞。
值傳遞:拷貝數據本身。傳遞結束,有兩份數據,但兩變量“相互獨立”。
引用傳遞:傳遞結束,數據只有一份,兩個變量同時指向該數據。
面向對象:默認值傳遞,可以引用傳遞。
class p{ var$v1=10; } $p1=new p(); $p2=$p1->v1; $p1->v1=20; var_dump($p1); var_dump($p2);
輸出結果為:$p1=20
$p2=10
class p{ var $v1=10; } $p1=new p(); $p2=$p1; //傳的是v1,不是v1的值 $p1->v1=20; var_dump($p1); var_dump($p2);
輸出結果為:$p1=20
$p2=20
class p{ var $v1=10; } $p1=new p(); $p2=&$p1->v1; $p1->v1=20; var_dump($p1); var_dump($p2);
輸出結果為:$p1=20
$p2=20
面向對象的方法:
例:
//斜邊 class person{ var $x=1; var $y=1; var $pi=1; function getxiebian($a,$b){ $s1=$a*$a+$b*$b; $s2=pow($s1,0.5); return $s2; } } $p1=new person(); $xie1=$p1->getxiebian(3,4); echo "<br />斜邊1=$xie1";
$this關鍵字:
$this是一個“偽對象”,代表當前所屬類的當前對象。
//類與對象的創建 “自我介紹” class Person{ public $name="匿名"; public $age=28; public $PI=3.14; function intro(){ echo"<b/>hi,大家好,我叫".$this->name; echo",今年".$this->age."歲<br/>"; } } $p1=new Person(); $p1->name="張三"; $p1->age=20; $p1->intro(); $p2=new Person(); $p2->name="李四"; $p2->age=22; $p2->intro();
一個系統函數:get_class(對象)
作用:獲得某個對象的“所屬類名”——結果只是一個類名字符串。
$class_name = get_class($p1); //結果是:”Person”
靜態屬性
定義:只隸屬於類本身——也可以看做是所有對象的“共有數據”。
使用:
//靜態屬性 class C1{ static $v1=10; //靜態屬性 } C1::$v1=100; //修改靜態屬性的值 $s1=C1::$v1; //取得靜態屬性的值 echo "s1=$s1"; $c1=new C1(); $c2=new c1(); echo "<br/>c1的中的靜態屬性v1=".$c1::$v1; $c1::$v1=1000; //通過$c1修改了靜態屬性值 echo "<br/>c2的中的靜態屬性v1=".$c2::$v1;
靜態方法
方法的前面加上static關鍵字修飾,就變成了靜態方法。
靜態方法同樣隸屬於類,而不是隸屬於具體對象。使用方法跟靜態屬性類似:
類名::靜態方法名();
靜態方法是只隸屬於類,而為所有對象所“共有”。
註意1:$this在靜態方法中不能使用。
self:代表當前類。
class S2{ public $v1=1; static function getNew(){ return new self; //self代表"當前類" } //new self代表當前類的一個對象 } echo"<hr />"; $obj2=S2::getNew(); //t通過S2的靜態方法得到該類的一個新對象 var_dump($obj2);
構造方法和析構方法:
構造方法是“創建”對象的時候會自動調用。
析構方法是“銷毀”對象的時候會自動調用。
class student{ public $name="匿名"; public $sex="未知"; static $age=18; const food="饅頭"; function intro(){ echo"<b/>hi,大家好,我叫".$this->name; echo",我是".$this->sex."生<br/>"; echo ",我愛吃".self::food."。<br>"; } function __construct($n,$s){ //構造方法 $this->name=$n; $this->sex=$s; } function __destruct(){ //析構方法 echo"<br/>被銷毀了"; } } echo"<hr/>"; $student1=new student(‘劉能‘,‘男‘); $student1->intro(); $student2=new student(‘趙四‘,‘男‘); $student2->intro(); echo"<hr/>";
2018-3-5 面向對象