LAMP兄弟連原創視頻教程(PHP筆記三--面向對象)

7.1 面向對象的概念
面對對象符合人的邏輯思維,有利於重複使用
有類纔有對象,類是爲了聲明對象,對象是獨立的
1.什麼是類 電腦本配置單,桌子圖紙
2.什麼是對象 電腦教室(20電腦,20桌子)
3.類和對象之間的關係
4.什麼是成員屬性,什麼是成員方法

7.2 類的聲明使用
如何抽象一個類
class 類名
{

}
<?php
 class Person
 {
  //成員屬性
  var $name;
  var $age;
  var $sex;
  
  function say()
  {
   echo "我在說話";
  }
  function run()
  {
   echo "我在跑步";
  }
 }
        //聲明定義對象
 $p1=new Person();
 $p2=new Person();
 $p1->name="張三";
 $p2->name="李四";
 $p1->say();
 $p2->say();
?>

7.3 對象實例化及使用
對象存儲在內存的堆中,通過對象的首地址存在棧內存
7.4 構造方法與析構方法
特殊的引用$this
構造方法特點:名稱和類名相同;對象一產生時,自動調動;常用於初始化屬性
<?php
 class Person
 {
  //成員屬性
  var $name;
  var $age;
  var $sex;
  /*
  //PHP5的構造方法,比PHP4的構造方法的優先級高
  fuction __construct()
  {
 
  }
  */
  function Person($name="",$age="",$sex="")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex; 
  }
  
  function say()
  {
   echo "我的名字叫:".$this->name."我的年齡:".$this->age;
  }
  function run()
  {
   echo "我在跑步";
  }
  //析造函數
  function __destruct()
  {
   echo $this->name."再見!";
  }
 }
        //聲明定義對象
 $p1=new Person("張三",20,"男");
 $p2=new Person("李四",22,"男");
 $p1->say();
 $p2->say();
?>

7.5 封裝性
將對象內部屬性和方法封裝有自己對象的內部,在對象的內部可以被使用或訪問,不能在外部被訪問
<?php
 class Person
 {
  //封裝成員屬性
  private $name;
  private $age;
  private $sex;
  
  function Person($name="",$age="",$sex="")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex; 
  }
  function setAge($age)
  {
   if($age<0||age>200)
    return;
   $this->age=$age;
   
  }
  function getAge()
  {
   return $this_>age-10;
  }
  function say()
  {
   echo "我的名字叫:".$this->name."我的年齡:".$this->age;
  }
  private function run()
  {
   echo "我在跑步";
  }
  private function eat()
  {
   echo "我在吃飯";
  }
 
 }
 $p1=new Person("張三",20,"男");
 $p1->setAge(21);
 $p2=new Person("李四",22,"男");
 $p1->say();
 $p2->say();
?>

7.6 封裝時所用的四個魔術方法
__set() __get() __isset() __unset() (用於清除變量)
兩下劃線開始的函數是在某一時刻自動調用的方法
<?php
 class Person
 {
  private $name;
  private $age;
  private $sex;
  
  function Person($name="",$age="",$sex="")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex; 
  }
   private function __set($proName,$value)
  {
   $this->$proName=$value;
  }
  function __get($proName)
  {
   if($proName=="name")
   {   
    return $this->$proName;
   }else if($proName=="age")
   {
    return $this->age;
   }
  }
  //判斷屬性是否存在
  function __isset($proName)
  {
   return isset($this->$proName);
    
  }
  //刪除屬性
  function __unset($proName)
  {
    unset($this->$proName);
  }
 }
 $p1=new Person("張三",20,"男");
 $p2=new Person("李四",22,"男");
 $p1->age=33;
 echo $p1->age;
 echo $p2->age;
 //isset沒重寫時只能判斷非私有的屬性
 if(isset($p1->name))
 {
  echo "屬性存在";
 }else
 {
  echo "屬性不存在"
 }
?>
7.7 繼承性(擴展性,重複性,共享性)
php的繼承爲單繼承,不存在多繼承,即一個子類只能有一個父類,父類的私有屬性和方法不能在子類中被訪問
<?php
 class Person
 {
  private $name;
  private $age;
  private $sex;
  
  function Person($name="",$age="",$sex="")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex; 
  }
   function say()
  {
   echo "我的名字叫:".$this->name."我的年齡:".$this->age;
  }
  private function run()
  {
   echo "我在跑步";
  }
  private function eat()
  {
   echo "我在吃飯";
  }
 }
 class Student extends Person
 {
  var $school;
  function study()
  {
   
  }
 }
 $s1=new Student("張三",22,"男");
 $s1->say();
?>
7.8 方法的覆蓋和訪問權限
PHP的重載指的是子類對父類的重寫
<?php
 class Person
 {
  private $name;
  private $age;
  private $sex;
  
  function __construct($name="",$age="",$sex="")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex; 
  }
   function say()
  {
   echo "我的名字叫:".$this->name."我的年齡:".$this->age;
  }
 }
 class Student extends Person
 {
  var $school;
  function __construct($name="",$age="",$sex="",$school="")
  {
   parent::__construct($name="",$age="",$sex="")
   $this->school=$school;
   
  }
  function study()
  {
   
  }
  function say()
  {
   //echo "我的名字叫:".$this->name."我的年齡:".$this->age;
   paraent::say();
   echo "我的學校".$this->school;
  }
 }
 $s1=new Student("張三",22,"男","北大");
 $s1->say();
?>
訪問類型 private protected public ,子類的訪問權限必須不能低於於父類

7.9 面向對象中常見的關鍵字
final static const
final:只能用來定義類和方法
    作用:作用final定義的類不能被繼承
              使用final定義的方法不能被重載
static:可以修飾屬性和方法,有static方法中不能有this關鍵字和不能使用非static成員

<?php
 class Person
 {
  private $name;
  private $age;
  private $sex;
  static $country="中國";
  
   function say()
  {
   echo "我的名字叫:".$this->name."我的年齡:".$this->age;
   echo "國家 :".sef::$country;
  }
 }
 
 echo Person::$country;
?>

const:是一個在類裏面定義成員屬性爲常量的關鍵字,只能修飾屬性,只能在初始化賦值
      類名::成員屬性
<?php
 class Person
 {
  private $name;
  private $age;
  private $sex;
  const COUNTRY="中國";
  
   function say()
  {
   echo "我的名字叫:".$this->name."我的年齡:".$this->age;
   echo "我的國家 :".sef::COUNTRY;
  }
 }
 
 echo Person::COUNTRY;
?>

7.10 常用的魔術方法
__toString() __clone() __call() __autoload()
<?php
 class Person
 {
  //封裝成員屬性
  private $name;
  private $age;
  private $sex;
  
  function Person($name="",$age="",$sex="")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex; 
  }
  //打印對象時調用
  function __toString()
  {
   retrun $this->name.$this->age;
  }
  //克隆時調用
  function __clone()
  {
   //這裏的this指的是克隆的副本
   $this->name="副本" .$that->name;
  }
  //調用不存在方法時,調用該方法
  function __call($funName,$argus)
  {
   echo "你調用的方法".$funName."不存在";

  }
 }
 $p1=new Person("張三",20,"男");
 $p2=new Person("李四",22,"男");
 echo $p1;
 $p3=clone $p1;
 $p1->fun1("one","two");
?>
<?php
 function __autoload($className)
 {
  include $className."_class.php";
 }
 $p1=new Person("張三",20,"男");
?>

7.11 對象的串行化與反串行化
對象的串行化的兩個過程
串行化:就是把對象轉爲二進制的字符串,serialize()
反串行化,就是把二進制字符串轉化爲對象 unserialize()
兩種情況下串行化和反串行化
第一種:對象在網絡中傳輸時
第二種:將對象寫入文件或者數據庫
<?php
 class Person
 {
  private $name;
  private $age;
  private $sex;
  
  function Person($name="",$age="",$sex="")
  {
   $this->name=$name;
   $this->age=$age;
   $this->sex=$sex; 
  }
  //序列化時調用,爲可選函數
  function __sleep()
  {
   $arr=array("name","age");
    return $arr;
  }
  //反序列化時調用,爲可選函數
  function __wakeup()
  {
   $this->name="李四";
   $this->age=50;
  }
  function say()
  {
   echo "我的名字叫:".$this->name."我的年齡:".$this->age;
  }
 }
 $p1=new Person("張三",20,"男");
 $str=serialize($p1);
 $file=fopen("tmp.txt","w");
 fwrite($file,$str);
 fclose($file);
 
?>
<?php
 include "person.php";
 $file=fopen("tmp.txt","r");
 $str=fread($file,filesize("tmp.txt"));
 fclose($file);
 $p=unserialize($str);
 $p->say();
 fclose($file);
 unserialize($file,$str )
?>

7.12 抽象方法與抽象類
抽象方法:在類裏面沒有方法體的方法就是抽象方法,即沒有大括號{}以及內容,在方法名後面加一個分號,另外還

要在方法聲明時加上一個關鍵字“abstract”來修飾。
<?php
 abstract class Demo
 { 
  var $demo="hello";
  abstract function fun1();
  function fun2()
  {
   echo "hello world!"; 
  }
  abstract function fun3();
 }
 class Test extends Demo
 {
  function fun2()
  {
   echo "xxxx";
  }
 }
 $t=new Test();
 $t->fun1();
 $t->fun2();
?>
抽象類:如果一個類裏面有一個方法是抽象的,這個類就是抽象類;這個類就要使用"abstract"關鍵字來修飾
注意:抽象類不可以實例化對象,繼承抽象類的子類必須實現抽象類中的所有抽象方法
用途:抽象類就相當一個規範
7.13 接口聲明與使用
作用:接口也是一種規範
注意: 同一個類可以實現多個接口
可以使用抽象類去實現一個接口的部分方法,使用類去實現接口中的
abstract clss Demo
{
 可以有成員屬性
 可以有普通方法
 至少有一個抽象方法
}
interface Demo
{
 所有的成員屬性必須是抽象的
 所有的方法都是抽象的
 所有成員都必須是public
}
<?php
 interface One
 {
  const TEST="hello";
  function fun1();
  function fun2();
 }
 interface Two extends One
 {
  function fun3();
  function fun4();
 }
 class Demo implements One
 {
  function fun1()
  {
   echo "111111";
  }
  function fun2()
  {
   echo "222";
  }
 }
 $d=new Demo();
 echo Demo::TEST."<br>";

 $d->fun1();
 $d->fun2();
?>

7.14 多態性

PHP的態性表現不明顯,原因是PHP的變量是弱類型的。
<?php
interface PCI
{
 function start();
 function stop();
}
class ViewCard implements PCI
{
 function start()
 {
  echo "可以看到圖像";
 }
 function stop()
 {
  echo "圖像消失";
 }
}
class SoundCard implements PCI
{
 function start()
 {
  echo "可以看到圖像";
 }
 function stop()
 {
  echo "圖像消失";
 } 
}
class MainBord
{
 function usePCI($pci)
 {
  $pci->start();
  $pci->stop();
 }
}
class Person
{
 function install()
 {
  $mb=new MainBord();
  $vc = new ViewCard();
  $sc=new SoundCard();
  $mb->usePCI($vc);
  $mb->usePCI($sc);
  /*
  $pci=$vc;
  $pci=$sc;
  $pci->start();
  $pci->stop();
  */
 }
}
$p=new Person();
$p->install();
?>

發佈了17 篇原創文章 · 獲贊 6 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章