第一篇:傳智播客 韓順平 php從入門到精通 61-78講面向對象課堂筆記
php面向對象編程 提出一個問題?
張老太養了兩只貓貓:一只名字叫小白,今年3歲,白色。還有一只叫小花,今年100歲,花色。請編寫一個程序,當用戶輸入小貓的名字時,就顯示該貓的名字,年齡,顏色。如果用戶輸入的小貓名錯誤,則顯示張老太沒有這只貓貓。數組<--->對象
array(1,56,90,100)->隱藏問題array(對象,對象。。)【數組對象】 首先我們用現有的知識來完成這個案例:
$cat1_name=”小白”;
$cat1_age=3;
$cat1_color=”白色”;
//變量是分開.$cat2_name=”小花”;
$cat2_age=100;
$cat2_color=”花色”;?>
我們能不能把屬于同一事物的變量,統一管理? 解決之道->對象 快速體驗案例:
//這就是一個類(貓類)class Cat{
//屬性
public $name;
public $age;
public $color;}
//創建一只貓 $cat1=new Cat();//給這只貓賦值.(具體各個)$cat1->name=“小白”;$cat1->age=3;$cat1->color=“白色”;$cat2=new Cat();$cat2->name=“小花”;$cat2->age=100;$cat2->color=“顏色”;//如果我們找到一只貓,只要找到 $cat1, 那么該變量所有相關的屬性都通通的找到 $findCatName=“小花”;
if($cat2->name==$findCatName){
echo $cat2->name.“||”.$cat2->age.“||”.$cat2->color;} ?>
我們這里說明一下類和對象的關系(細節后面逐步展開)
總結幾句話:
①
類是抽象的,代表一類事物 ②
對象是具體,是類的一個具體實例 ③
類是對象的模板, 對象是類的一個個體實例
php面向對象編程
成員屬性的說明
1.成員屬性是從某個事物提取出的,它可以是基本數據類型(整數、小數、字符、布爾),也可以是復合數據類型(數組、對象)
class Cat{ public $name;public $age;}
//創建對象
$cat1=new Cat;
$cat1=new Cat();?>
2.怎樣訪問一個成員屬性(其它成員屬性是public)基本語法是 $對象名->屬性名;
?如果一個文件,專門用于定義類,則命名規范應當這樣
類名.class.php 分析對象在內存中存在的形式 //定義一個人類 class Person{ public $name;public $age;} $a=new Person();$a->name=“小明”;$a->age=20;//把a變量(對象),賦給$b $b=$a;echo $a->name.“
”;echo $b->name.“
”;
再次說明: $a=78;//$b=$a;$b=&$a;$b=$b+8;echo $a.“||”.$b;
如果給一個函數傳遞一個對象,實際上是傳遞的一個地址.//看下面的一段代碼: class Person{
public $name;public $age;} $p1=new Person();$p1->name=“韓順平”;$p1->age=33;//函數接收對象時候,究竟是傳入值,還是地址(!!)
function test1($p){ $p->name=“小明”;} test1($p1);echo $p1->name;分析圖
如果給函數傳遞的是基本數據類型(整數、小數、布爾、字符),究竟傳遞的是什么? 結論 : 在默認的情況下是傳遞的值,如果你希望傳入地址 function test(&$變量....){ }
在php中如果,給一個函數傳遞的是數組,則默認情況下是傳值(拷貝了新的數組),如果希望傳入地址,則應當,&$數組名 學生問題?
$a1=array(1,3,900);$a2=array(56,90,100);
$arr=array($a1,$a2);
foreach($arr as $k=>$v){
echo “$k=$v”;} ?>
成員方法的講解 函數和成員方法關系:
當我們把一個函數寫到某個類中,則該函數可以稱成員方法:
我們有這樣一個需求;希望人可以說話, 做算術題.......,這樣就需要使用到成員方法: ①添加speak 成員方法,輸出我是一個好人
②添加jisuan成員方法,可以計算從 1+..+1000的結果
③修改jisuan成員方法,該方法可以接收一個數n,計算 1+..+n 的結果
④添加add 成員方法,可以計算兩個數的和 成員方法的基本語法:
訪問修飾符號 function 函數名(參數列表){
//函數體
//return 語句;}
class Person{
public $name;
public $age;
public function speak(){
echo “我是一個好人!”;
}
public function count1(){
$res=0;
for($i=1;$i<=1000;$i++){
$res+=$i;
}
//return 究竟到什么地方去?誰調用,就返回給誰
return $res;
}
//修改jisuan成員方法,該方法可以接收一個數n,計算 1+..+n 的結果
public function count2($n){
$res=0;
for($i=0;$i<=$n;$i++){
$res+=$i;
}
return $res;
}
//添加add 成員方法,可以計算兩個數的和
public function add($num1,$num2){
return $num1+$num2;
}
}
//如何使用函數
//1.創建一個人
$p1=new Person();
//通過對象去訪問,調用成員方法.//這里強調,調用成員方法和調用普通函數的機制,仍然不變
$p1->speak();
//讓這個人做算術題
$res=$p1->count1();
echo '計算結果是='.$res;
//讓這個人可以接收一個數,然后計算
echo “計算結果是=”.$p1->count2(100);
echo “計算結果是=”.$p1->count2(100);
echo “計算結果是=”.$p1->count2(100);
echo “23+89=”.$p1->add(23,89);?>
成員方法的細節
我們在實際開發,其實通常是這樣來使用類
Person.class.php < ?php
class Person{
//成員屬性
public $name;
public $age;
//成員方法
public function speak(){
echo “我是一個好人!”;
}
public function count1(){
$res=0;
for($i=1;$i<=1000;$i++){
$res+=$i;
}
//return 究竟到什么地方去?誰調用,就返回給誰
return $res;
}
//修改jisuan成員方法,該方法可以接收一個數n,計算 1+..+n 的結果
public function count2($n){
$res=0;
for($i=0;$i<=$n;$i++){
$res+=$i;
}
return $res;
}
//添加add 成員方法,可以計算兩個數的和
public function add($num1,$num2){
return $num1+$num2;
}
//添加一個新的方法,可以判斷三個數最大的數
public function findMax($arr){
//這里仍然可以寫算法
//從$arr數組中,找到最大的數.//1.假設數組的第一個數就是最大的數
$maxVal=$arr[0];
//2.最大數的下標是
$maxIndex=0;
//開始循環的比較
for($i=1;$i //這個條件說明,maxVal不是最大 if($maxVal<$arr[$i]){ //調整 $maxVal=$arr[$i]; $maxIndex=$i; } } return $maxVal; } } ?> Exercise01.php < ?php //引入類文件 require_once ?Person.class.php?; //創建對象 $p1=new Person(); //調用$p1的各個方法 $p1->speack(); $p1->count1();..?> 案例:編寫一個函數(以面向對象的方式開發),從網頁輸入一個整數打印出對應的金子塔: 當我們學習完成員方法后,我們的類定義就完善一步了: 1.設計計算機類,要求如下: 屬性:品牌,顏色,cpu型號,內存容量,硬盤大小,價格,工作狀態 方法: 打開,關閉,休眠(表示)創建一個計算機對象,調用打開,關閉方法.php面向對象編程 構造方法 class Person{ public $name; public $age;} $p1=new Person();//再給屬性賦值 $p1->name=”宋江”;$p1->age=33; //需求在創建一個人對象時候,我就初始化 name 和 age;->構造方法 我們快速入門: class Person{ public $name; public $age; public function __construct(){ echo “我是構造方法”; } //業務代碼要放在成員方法 public function findPerson(){ } } $p1=new Person();?構造方法沒有返回值, 它是自動被調用 2.在php 5 中一個類可以同時有兩種形式的構造方法 __construct()和類名(), 當兩個同時存在的時候,優先調用__construct(), 請大家以后使用__construct() this的理解 class Person{ public $name;public $age; //這個就是構造方法,php5獨有 public function __construct($iname,$iage){ //$name認為$name是一個新的變量 //$name=$iname; //$age=$iage; $this->name=$iname; $this->age=$iage; echo “我是構造方法”;} } $p1=new Person(“張清”,90);echo “hello-”.$p1->name;$p2=new Person(“宋江”,33);echo “aa-”.$p2->name;$this 理解圖: ? 1.$this 本質可以理解就是這個對象的地址 2.哪個對象使用到$this, 就是哪個對象地址 3.$this不能在類外部使用.構造方法的注意事項 (1)一旦自定義了一個構造函數,默認的 構造函數就被覆蓋了,這時在創建對象的時候就要使用自定義的構造函數.(2)一個類只能有一個構造函數.(不能重載)構造方法的8點說明: ①構造方法名和類名相同(php4版),php5版的構造方法 名可以和類名相同,也可以是__construct()②構造方法沒有返回值 ③主要作用是完成對新對象的初始化,并不是創建對象本身。④在創建新對象后,系統自動的調用該類的構造方法 ⑤一個類有且只有一個構造方法,在php5后雖然__construct()和類名()可以共存,但是實際上也只能使用一個。 ⑥如果沒有給類自定義構造方法,則該類使用系統默認的構造方法。class Cat{ funciton __construt($name){ echo “ok”;} } $cat1=new Cat(); ⑦如果給類自定義了構造方法,則該類的默認構造方法被覆蓋。⑧構造方法的默認訪問修飾符是public 析構方法 析構方法的作用主要用于,釋放資源(比如釋放數據庫的鏈接,圖片資源...銷毀某個對象..)快速入門 class Person{ public $name; public $age; public $conn; //構造方法 public function __construct($name,$age){ $this->name=$name; $this->age=$age; //打開一個$conn鏈接數據庫的資源 } //寫一個析構方法 __ 是兩個下劃線 function __destruct(){ echo $this->name.“銷毀資源關閉數據庫.. } } $p1=new Person(“賈寶玉”,16); $p2=new Person(“林黛玉”,14);?> 運行代碼我們得出: 1.析構方法會自動調用 2.析構方法主要用于銷毀資源 3.析構方法調用順序是,先創建的對象后被銷毀 4.析構方法什么時候被調用(1)當程序(進程結束)退出時 (2)當一個對象稱為垃圾對象的時候,該對象的析構方法也會被調用,(3)所謂垃圾對象,就是指,沒有任何變量再引用它.(4)一旦一個對象成為垃圾對象,析構方法就會立即調用 示意圖: 小結: ①php5加入的的析構方法function __destruct()②析構方法沒有返回值 ③主要作用是釋放資源的操作,并不是銷毀對象本身。④在銷毀對象前,系統自動的調用該類的析構方法 ⑤一個類最多只有一個析構方法。 更新時間:2013年01月03日17時03分 來源: 靜態變量 提出一個問題: 說,有一群小孩在玩堆雪人,不時有新的小孩加入, 請問如何知道現在共有多少人在玩?請使用面向 對象的思想,編寫程序解決。思路: 1.使用全局變量 * 什么是全局變量, 在程序中,都可以使用的變量稱為全局變量.當我們了解全局變量后,我們來看看如何解決問題? //定義,完游戲的全局變量 global $global_nums; //賦值 $global_nums=0; class Child{ public $name; function __construct($name){ $this->name=$name; } public function join_game(){ //聲明一下使用全局變量 global $global_nums; $global_nums+=1; echo $this->name.“加入堆雪人游戲”; } } //創建三個小孩 $child1=new Child(“李逵”); $child1->join_game(); $child2=new Child(“張飛”); $child2->join_game(); $child3=new Child(“唐僧”); $child3->join_game(); //看看有多少人玩游戲 echo “ 2.使用靜態變量 靜態的變量的基本用法 1.在類中定義靜態變量 [訪問修飾符] static $變量名;2.如何訪問靜態變量 如果在類中訪問 有兩種方法self::$靜態變量名 , 類名::$靜態變量名 如果在類外訪問: 有一種方法類名::$靜態變量名 3.靜態變量存在方式 解法: class Child{ public $name; //這里定義并初始化一個靜態變量 $nums public static $nums=0; function __construct($name){ $this->name=$name; } public function join_game(){ //self::$nums使用靜態變量 self::$nums+=1; echo $this->name.“加入堆雪人游戲”; } } //創建三個小孩 $child1=new Child(“李逵”); $child1->join_game(); $child2=new Child(“張飛”); $child2->join_game(); $child3=new Child(“唐僧”); $child3->join_game(); //看看有多少人玩游戲 echo “ ? 靜態方法 需求: 當我們操作靜態變量的時候,我們可以考慮使用靜態方法,比如統計所有學生交的學費 在我們編程中,我們往往使用靜態方法去操作靜態變量.靜態方法的特點 1.靜態方法去操作靜態變量 2.靜態方法不能操作非靜態變量.這里請注意 : 普通的成員方法,既可以操作非靜態變量,也可以操作靜態變量 ? php面向對象編程的三大特征 ① 封裝 ② 繼承 ③ 多態 抽象 class Account { public $blance; public $no; public function qun(){ } public function cun(){ } } ? 封裝 那么在php中如何實現這種類似的控制呢?請大家看一個小程序.(visit1.php),不能隨便查看人的年齡,工資等隱私...class Person{ public $name; private $age; private $salary; function __construc($name,$age,$salary){ $this->name=$name; $this->age=$age; $this->salary=$salary } } php提供了三種訪問控制符號.有三種 1.public 表示全局,可以在本類,類外部,子類中使用 2.protected 表示受到保護,可以在本類, 子類中使用 3.private 表示私有, 只能在本類使用 這三個控制修飾符號可以對屬性和方法修飾 1.如果一個方法沒有訪問修飾符,則默認是public 2.屬性必須指定訪問修飾符 ?方法之間可以互相調用.但是需要使用 $this引用 function test11(){ $this->test12(); } protected function test12(){ echo “test12 hello”; } 舉例說明: class Person{ public $name; protected $age; private $salary; function __construct($name,$age,$salary){ $this->name=$name; $this->age=$age; $this->salary=$salary; } //成員方法 function showInfo(){ //這里說明在本類中可以使用 public protected 和private 修飾的變量.echo $this->name.“||”.$this->age.“||”.$this->salary; } } //創建一個人 $p1=new Person(“孫悟空”,30,1000); echo $p1->name;//可以 echo $p1->age;//報錯 echo $p1->salary;//報錯.?我們現在就想去訪問protected 變量或者 private 變量, 通常的做法是提供 public 函數去訪問這些變量.形式是 public function setXxx($val){ } public function getXxx(){ } public function showInfo(){ } public protected private 可以修飾屬性和方法 (1)查看薪水(private)//獲取這個人的薪水 public function getSalary($user,$pass){ if($user==“shunping” && $pass=“123”){ return $this->salary; }else{ return “sorry,你無法看”; } }(2)修改人的年齡 提供了兩個函數.//修改年齡,對輸入的值,進行校驗.public function setAge($age){ if($age>1 && $age<120){ $this->age=$age; }else { echo “年齡范圍不對”; } } //查看年齡 public function getAge(){ return $this->age; } 還有一種形式, 通過一對 __set 和 __get方法來操作我們的變量,不推薦.class A{ private $n1; private $n2; private $n3; //使用__set 方法來管理所有的屬性 public function __set($pro_name,$pro_val){ $this->pro_name=$pro_val; } //使用__get 可以獲取所有的屬性值 public function __get($pro_name){ if(isset($pro_name)){ return $this->pro_name; }else{ return null; } } } $a1=new A(); $a1->n1=“hello”; echo $a1->n1; $a1->n2=890; echo “||”.$a1->n2; 可以直接寫一個方法了操作變量 class Peron{ protected n1; private $n2; function showInfo($n1){ $this->n1=$n1; echo $this->n1.”||”$this->n2;} } ? 為什么需要繼承 //應用場景開發一套學生管理系統(Pupil, Graduate ,...) //小學生類 class Pupil{ public $name; protected $age; protected $grade; public function showInfo(){ echo $this->name.“||”.$this->age; } public function tesing(){ echo “ 小學生考試..”; } } //研究生類 class Graduate{ public $name; protected $age; protected $grade; public function showInfo(){ echo $this->name.“||”.$this->age; } public function tesing(){ echo “研究生考試..”; } } 從上面的代碼我們看出,代碼的復用性不高,同時也會讓管理代碼成本增高.? 解決之道(繼承); 現在我們使用繼承對上面的代碼,進行改寫.代碼: //應用場景開發一套學生管理系統(Pupil, Graduate ,...) //父類 class Stu{ public $name; protected $age; protected $grade; public function showInfo(){ echo $this->name; } } //子類 class Pupil extends Stu{ public function testing(){ echo “ 小學生考試..”; } } class Graduate extends Stu{ public function testing(){ echo “研究生考試..”; } } //創建學生 $stu1=new Pupil(); $stu1->name=“小明”; $stu1->testing(); $stu1->showInfo(); //創建一個研究生 $stu2=new Graduate(); $stu2->name=“老明”; $stu2->testing(); $stu2->showInfo(); ?從上面的代碼我們可以看出: 所謂繼承就是一個子類通過 extends 父類 把父類的(public / protected)屬性和(public / protected)方法繼承下來.繼承的基本語法是: class 類名 extends 父類名{ //在寫自己需要的屬性和方法.} 討論繼承細節: 討論繼承細節: 1.父類的 public、protected 的屬性和方法被繼承.private 的屬性和方法沒有被繼承.2.一個類只能繼承一個父類,(直接繼承).如果你希望繼承多個類的屬性和方法,則使用多層繼承 class A{ public $n1=90;} class B extends A{ public $n2=“hello”;} class C extends B{ } $c=new C();echo $c->n1; 3.當創建子類對象的時候,默認情況下,不會自動調用父類的構造方法.class A{ public $n1=90; //構造方法 public function __construct(){ echo “A __construct”; } } class B extends A{ function __construct(){ echo “B __construct”; } } //創建B對象實例 $b=new B(); 4.如果我們希望去調用父類的構造方法,或者其它的方法(public / protected),可以這樣處理(了解) 4.1 類名::方法名()4.2 parent::方法名()舉例 class A{ public $n1=90; //構造方法 public function __construct(){ echo “A __construct”; } } class B extends A{ function __construct(){ echo “B __construct”; //顯式的調用父類的方法 //A::__construct(); parent::__construct(); } } //創建B對象實例 $b=new B(); 5.當一個子類的方法和父類的方法完全一樣(public protected), 我們稱為方法的覆蓋(方法重寫) 重載 基本概念: 函數名一樣,通過函數的參數個數或者是參數類型不同,達到調用同一個函數名,但是可以區分不同的函數 class A{ public function test1(){ echo “test1”;} public function test1($a){ echo “test1 hello”;} } 重載 $a =new A();$a->test1();$a->test1(456);上面的這用用法是不對.PHP5 中如何通過魔術函數來實現方法重載的效果 代碼說明 class A{ public function test1($p){ echo “接收一個參數”; echo “ var_dump($p); } public function test2($p){ echo “接收兩個參數 var_dump($p); } //這些提供一個__call //__call 是它一個對象調用某個方法,而該方法不存在,則 //系統會自動調用__call function __call($method,$p){ var_dump($p); if($method==“test”){ if(count($p)==1){ $this->test1($p); }else if(count($p)==2){ $this->test2($p); } } } } $a=new A(); $a->test(1); $a->test(56,90); ?> 小結: 關于重載 ① php5 默認情況下不直接支持方法重載 ② php5 可以同__call魔術方法,模擬一個方法效果的效果 方法的重寫/方法的覆蓋(override)① 先看一個問題 當一個父類知道所有的子類都有一個方法,但是父類不能確定該方法究竟如何寫,可以讓子類去覆蓋這個方法,具體用法如下: //抽象一個Animal類 class Animal{ public $name; protected $price; function cry(){ echo “不知道動物怎么叫..”; } } class Dog extends Animal{ //覆蓋 function cry(){ echo “小狗汪汪叫..”; } } class Pig extends Animal{ //覆蓋.function cry(){ echo “哼哼叫..”; } } //創建一個只狗 $dog1=new Dog(); $dog1->cry(); $pig1=new Pig(); $pig1->cry();?> 關于方法重寫細節討論 1.要實現重寫,要求子類的那個方法的名字和參數列表個數一摸一樣,但是并不要求參數的名稱一樣.2.如果子類要去調用父類的某個方法(public / protected)則可以使用 parent::方法名(參數..), 父類名::方法名(參數...)3.在實現方法覆蓋的時候,訪問修飾符可以不一樣 //但是必須滿足: 子類的訪問范圍>=父類的訪問范圍 多態體現在什么地方? class Animal{ public function cry(){ echo '動物叫喚..'; } } class Cat extends Animal{ public function cry(){ echo “abc”; } } $cat1=new Cat(); $cat1->cry();當子類沒有覆蓋父類的方法則 $cat1->cry()調用的是父類,當子類覆蓋了父類的方法,則調用自己的cry() 抽象類 為什么設計抽象類這個技術? 1.在實際開發中,我們可能有這樣一種類,是其它類的父類,但是它本身并不需要實例化,主要用途是用于讓子類來繼承,這樣可以到達代碼復用.同時利于項目設計者,設計類.快速入門 //在實現方法覆蓋的時候,訪問修飾符可以不一樣 //但是必須滿足: 子類的訪問范圍>=父類的訪問范圍 abstract class Animal{ public $name; protected $age; //這個方法沒有方法體,這個方法主要是為了讓子類去實現.abstract public function cry(); } class Cat extends Animal{ public function cry(){ echo “貓貓叫喚..”; } } //創建一個子類實例 $cat1=new Cat(); $cat1->cry();使用抽象類的注意事項: 1.基本用法 abstract class 類名{ //方法 //屬性 } 2.如果一個類使用abstract 來修飾,則該類就是抽象類, 如果一個方法被abstract修飾,則該方法就是抽象方法【抽象方法就不能有方法體.】 3.抽象類可以沒有抽象方法.同時還可以有實現了的方法. //在實現方法覆蓋的時候,訪問修飾符可以不一樣 //但是必須滿足: 子類的訪問范圍>=父類的訪問范圍 abstract class Animal{ public $name=“abc”; protected $age; //這個方法沒有方法體,這個方法主要是為了讓子類去實現.abstract public function cry(); public function getName(){ return $this->name; } } class Cat extends Animal{ public function cry(){ echo “貓貓叫喚..”; } } //創建一個子類實例 $cat1=new Cat(); $cat1->cry(); echo $cat1->getName(); ?> 4.如果一個類中,只要有抽象方法,則該類必須聲明為abstract abstract class A{ abstract function test(); } echo “ok”; 5.如果A類繼承了一個抽象類 B,則要求A類實現從B類繼承的所有抽象方法 案例: //這是一個抽象類 abstract class A{ abstract function test(); } //B類要么自己抽象,或者實現從A類繼承的抽象方法.class B extends A{ function test(){ echo “我實現A:test()”; } } echo “hello” 接口 快速入門: //使用程序模擬現實情況 //定義規范(方法/屬性) interfaceiUsb{ public function start(); public function stop(); } //編寫相機類,讓它去實現接口 //1.當一個類實現了某個接口,則要求該類必須實現這個接口的所有方法 class Camera implements iUsb{ public function start(){ echo “相機開始工作”; } public function stop(){ echo “相機停止工作...”; } } //編寫手機類 class Phone implements iUsb{ public function start(){ echo “手機開始工作”; } public function stop(){ echo “手機停止工作...”; } } //如何使用 $camera1=new Camera(); $camera1->start(); $camera1->stop(); echo “ //手機對象 $phone1=new Phone(); $phone1->start(); $phone1->stop();?> 1.接口的使用基本語法 interface 接口名{ //屬性 //方法 } 接口的方法都不能有方法體 如何去實現接口 class 類名 implements 接口名1,接口2.{ } 接口它的作用就是聲明一些方法,供其它類來實現.接口還體現編程中我們希望的效果高內聚低耦合的特點: 繼承是實現接口的關系一覽圖 深入討論接口-interface 什么情況下可以考慮使用接口 1.定規范 2.定下規范,讓別的程序員來實現,比如: //韓是項目經理 //學生管理系統(students) //定義接口 interfaceStuManageInterface{ public function addStudent($stu); public function delStudent($id); public function updStudent($stu); } //給三 classStuManage { public function tianjiaxuesheng(){ } } //四 3.當多個類,他們之間是平級的關系.這些類都會去實現某個功能,只是實現的方式不一樣.接口的細節 1.不能去實例化一個接口 interfaceiUsb{ } $a=new iUsb();(錯誤!!) 2.接口中的所有方法,都不能有方法體 3.一個類可以去實現多個接口 語法: class 類名 implements 接口1,接口2{ } 4.接口中可以有屬性,但是必須是常量,并且是public interfaceiUsb{ const A=90; } echo “ok”.iUsb::A; 5.接口的方法是public 【默認就是public 】 ,不能是 protected 和private 舉例: interfaceiUsb{ const A=90; function test(); } echo “ok”.iUsb::A;6.類和接口之間關系一覽圖 代碼: interface iUsb2{ public function a(); } interface iUsb3{ public function b(); } interfaceiUsb extends iUsb2,iUsb3{ const A=90; function test(); } class Class1 implements iUsb{ public function a(){ } public function b(){ } public function test(){ } } echo “ok”.iUsb::A;?> 從上面我們看出 ① 一個接口可以繼承多個其它的接口.當一個類去實現了某些接口,則必須把所有接口的方法,都實現 繼承和實現接口的比較:(1)可以認為實現接口是對單一繼承的補充.(2)可以在不破壞類層級關系的前提下,對某個類功能擴展.final關鍵字 1.如果我們希望某個類不被其它的類來繼承(可能因為安全考慮...), 可以使用final final class A{ } class B extends A{ } echo “ok”;?> 2.如果我們希望某個方法,比如計算個人所得稅的方法,不能子類改寫,可以使用fianl來修飾方法 class A{ final public function getRate($salary){ return $salary*0.08; } } class B extends A{ //不能去覆蓋父類的getRate方法./*public function getRate($sal){ return $sal*0.01; }*/ } $b=new B(); echo $b->getRate(100);3.final關鍵字不能去修飾屬性.const關鍵字的講解 //當你有一個屬性,不希望被修改,則考慮使用const做成常量 基本用法是 class A{ const常量名=賦初值;} interface 接口名{ const常量名=賦初值;} 常量是public 使用類名::常量名;接口名::常量 class A{ //常量在定義的時候,必須給初值.//const關鍵字前面不要帶修飾符號.const TAX_RATE=0.08; public function payTax($val){ //常量不能修改.//A::TAX_RATE=0.01; //return $val*self::TAX_RATE;【ok】 return $val*A::TAX_RATE;//【ok】 } } $a=new A(); echo $a->payTax(200);?> 1.常量在定義的時候需要賦初值 2.常量不能修改.3.常量名不能有 $, 一般是大寫, 默認是public 4.常量在類的內部使用 self::常量的名稱類名::常量的名稱 在類的外部使用類名::常量的名稱.面向對象編程的綜合案例 現在我們一起來完成一個稍微綜合的案例---php版本的計算器,從而加深對php的認識,為下一步學習做準備。先用兩個頁面來完該計算器: myCal.php(界面)myResult.php(計算)知識點: 1.如何接收php頁面提交的數據,并處理 2.php中如何使用javascript完成對數據合法性的校驗 我們一起來開發.5.畫出程序框架圖: 6.編寫代碼: 現在我們分析如果要求把 xml 的作業改成面向對象的方式.怎么該? 做網站 Web程序。 需要制作一臺可以在網絡上被別人訪問到的機器。 安裝了瀏覽器的計算機: browser端 能夠提供網絡資源的計算機:(網站在這臺計算機上),能夠提供某種服務。Server端。 B/S是什么意思? 瀏覽器/服務器的架構: 請求:瀏覽器端向服務器端發送數據。Request 響應:服務器向瀏覽器端發送數據。回應,Response 什么樣的計算機叫做服務器端? 安裝了服務器軟件的計算機。 Web服務器軟件:iis,nginx,apache。 其中apache還是目前與php配合使用最多的服務器軟件: 安裝apache這個軟件,使jsj成為一臺web服務器。 http:// Apache的默認的文檔目錄 apache的安裝目錄下/htdocs/ 什么是靜態網站,動態網站? 靜態,網站上所有的內容,都是由靜態頁面提供的。 動態:網站的內容,是來源于某個數據源(數據庫,互聯網),而,在需要展示某些數據時,通過某種語言,將數據從數據源內提取,然后再展示到頁面上。 如果需要做動態網站,需要 1,數據源(數據庫)mysql數據庫 2,某種語言(用于提取和展示數據之用)PHP Amp開發: 利用apache作為web服務器,使別人可以訪問到我們的網站 利用mysql作為數據源,可以保存動態網站所需要的數據 利用php來獲得某個操作所需要的數據。 小測試: 輸出1-100 編寫php文件: 訪問這個php文件: 發現,可以訪問到,但是不能解析。 Apache只有提供被訪問的功能,而不能提供解析php代碼的功能。 因此需要安裝php程序,提供解析php代碼的功能: 安裝PHP: 所有的請求都是web服務器來接收的(apache),但是其中某些資源需要php來處理。通常的處理方式,是將php作為apache內部的一個模塊來管理的。 將php安裝成apache模塊: 使用一個apache的指令,loadModule來完成: 解壓php的安裝包: 不需要安裝可以直接執行 將php軟件復制到相應的目錄: E:/amp/php 由于不需要安裝,目錄內的可執行文件直接可以使用: 在php目錄內,有個文件,就是php為apache提供的apache模塊: 需要使用apache的LoadModule載入這個模塊即可: 需要在apache的配置文件內,使用上面的LoadModule指令: apache的配置文件在 apache的安裝目錄/Conf/httpd.conf 增加如下指令即可: 修改配置文件后,需要重啟動apache服務才可以: 配置apache,告知apache,哪樣的前請求需要調用php來解析,而哪些不需要: 通過請求的資源的后綴名 使用apache的FilesMatch指令來完成: 當匹配到php后綴時,調用php來處理: Apache的配置文件內: 請求php文件時,php代碼可以執行: 大家可以使用phpinfo()函數來測試以下,當前的php運行的環境: 安裝php后,需要配置一些最基本的配置項: 修改php的配置文件: Php的安裝目錄/php.ini 根據需要,將相應的更改成php.ini即可: 由于php作為apache一個模塊,因此需要告知apache,在哪里才能找到php的配置文件。利用apache的指令PhpIniDir來完成: 修改配置文件,達到某些目的: 1,時區 2, php擴展文件的目錄。Php的很多功能,并不是內置到php的軟件內的。在需要使用某個功能時,再載入即可。這個擴展的功能文件是被保存到某個目錄內的,稱之為php的擴展目錄: Extension_dir: 修改完了php的配置,也需要重啟apache才能生效 如果我們的php需要操作數據的話,需要利用數據軟件了。安裝Mysql。 1,安裝 2,配置 配置mysql的安裝目錄,和mysql數據的保存目錄: 安裝完成時,勾選運行配置向導,完成配置的過程: 配置字符集: 簡單介紹Mysql: 數據庫服務器: 屬于server端。因此,需要等待某個程序請求他才可以運行。 能夠對mysql數據庫服務器發出請求的我們稱之為mysql客戶端。 C/S Client客戶端 Server服務器 在安裝完mysql后,其實安裝了2個軟件1,mysql的服務器端,2,mysql的客戶端。 我們需要使用php來操作mysql。 其實 在php操作mysql的過程中,php就變成了 mysql的客戶端。 Php能夠作為mysql的客戶端,使用php的php_mysql.dll這個擴展完成,而且,這個擴展不是默認開啟的。 開啟相應的mysql的操作擴展,利用php的指令extension來完成。Php.ini: B/S C/S 1,服務器在監聽(運行),提供某個服務 2,瀏覽器或者客戶端,對服務器發出請求。在發送請求時,請求的數據一定要按照某種數據格式才可以。數據格式在網絡數據傳輸時稱之為網絡協議。3,服務器接收到請求后,會根據請求數據,進行相應的操作。4,將處理好的結果返回給瀏覽器(客戶端),回應。Response 5,瀏覽器端(客戶端)對回應的數據進行展示輸出,b/s 都是用瀏覽器發出請求的。 http https c/s架構,都是采用某個服務專用的客戶端發出的請求。 Bs架構通常,任何兩次請求回應周期是沒有任何聯系的。在發出請求時,都需要先建連接。 Cs通常,在連接一次之后,通常就會保持住這個連接,后續的操作,就不需要再次建立連接了。 PHP與apache聯系: 1,php作為apache的模塊而存在。loadModule 2,web服務器與php之間通過 CGI方式產生聯系。CGI(通用網關接口),IIS+PHP。現在CGI被fastCGI。Nginx+PHP apache的虛擬主機: 通常一個web服務器,代理的是一個網站。 有時我們需要利用一個web服務器,管理多個站點。不同的站點擁有獨立的域名。 通過配置apache服務器,達到,訪問 Test.kang.com時,看到的是test目錄的內容。Shop.kang.com時,看到的是shop目錄的內容 Apache的基于域名的虛擬主機技術: 主機:一個網站,就是一些php文件的集合,一個保存php文件的目錄 域名:指向某個網站的名稱。 通過修改apache配置文件達到效果: Apache/comf/httpd.conf 原則上在這個配置文件內寫虛擬主機的配置就可以了。但是通常我們都是將虛擬主機的配置寫到某個單獨的配置文件內,然后將這個虛擬主機配置文件再載入到apache的這個httpd.conf配置文件內。引入的操作: 虛擬主機的專門的配置文件: 編輯這個虛擬主機文件,增加虛擬主機: 在配置文件內,每一個 域名和目錄是一個虛擬虛擬主機最基本的必備元素。 完成以上的操作,apache配置已經完成,apache上已經存在兩個虛擬主機了: 在配置了虛擬主機之后,我們對web服務器的默認訪問(沒有使用配置的虛擬主機域名的訪問),都會訪問到默認的主機上。 默認的主機: 1,在配置了虛擬主機后:默認的主機就是 第一個配置的虛擬主機 2,在沒有配置虛擬主機時,是htdocs目錄。 那么怎么才能在使用虛擬主機的前提下,讓localhost訪問到原來的htdocs? 如何能夠通過在瀏覽器上輸入相應的虛擬主機域名訪問到我們的虛擬主機呢? 在瀏覽器端,需要通過相應的域名,解析成目標服務器的ip地址才可以。 可以通過過瀏覽器端操作系統上自帶的 域名解析文件完成。Hosts 配置虛擬主機時,常用的配置: 目錄的權限的配置 利用apache的directory指令段完成配置 看 httpd.conf的配置: 目錄級別的配置,對當前目錄,及其后代目錄有效果。 如果在apache的配置文件內,沒有對某個目錄進行配置,則采用默認的目錄配置 可以通過修改默認的配置達到目的,但是通常是針對目錄進行單獨配置: 增加一個 Directory指令段: 為了將目錄與虛擬主機聯系起來,通常在VirtualHost內,使用Directory指令 Conf/extra/httpd-vhosts.conf 直接訪問目錄的配置: 在訪問目錄時,先檢測當前目錄是否配置了目錄索引頁,如果配置了索引頁,則展示索引頁的內容。目錄的索引頁使用apache的指令 directoryIndex完成配置。這個指令是可以寫到directory段內。 如果沒有配置目錄索引頁:則需要將目錄的的內容以列表的形式顯示出來,但是是通過配置apache的指令options加以配置,是否可以顯示目錄的索引列表。 可以在配置 options時 增加上允許符號連接的配置: Apache的配置文件系統: Apache程序,只會在apache服務器啟動時,讀取apache配置文件的內容,稱之為apache主配置文件。 一旦配置文件的語法出錯,就會導致apache服務器啟動失敗,提示: Apache提供一個apache的配置文件檢查的功能: 也可以通過 cmd,命令行運行: Apache還有一個配置文件,稱之為apache的分布式配置文件,apache允許在某個目錄內部,使用獨立的配置文件,來配置當前目錄及其后代目錄的中的一些設置。但是此時配置文件名稱,就不是httpd.conf了 而是.htaccess 在這個.htaccess配置文件中配置的內容,只能是目錄級別的配置。 但是默認情況下,分布式配置文件是不可以使用的。可以通過在主配置文件中使用apache的 Allowoverride指令加以配置。由于分布式配置文件是配置目錄的,因此 allowoverride也是需要寫到Directory段。 分布式與主配置文件的區別: 1,主配置文件需要保存到Conf目錄中,而分布式需要保存到所有需要配置的目錄中 2,主配置文件只要在apache啟動時,才讀取,而分布式配置文件,在apache訪問到某個目錄時都會讀取一次。 作業 1,每個人配置一個虛擬主機: 域名是 test.ip.com Test.100.com 2,在test.ip.com上增加一個表單頁面 Welcome.html頁面 最好在表單提交時,驗證姓名不能為空,為空給出提示,不能提交。 分析上面的例子: 發生了幾次請求和回應的過程。
”;
有”.$global_nums;?>
有這”.Child::$nums;
接收到參數是”;
”;
”;第二篇:傳智播客 PHP程序員筆記第一天