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