什么是面向?qū)ο螅?/h3>
準(zhǔn)確的說面向?qū)ο缶幊涛覀兘?OOP风范,面向?qū)ο蟮木幊谭譃槿糠郑好嫦驅(qū)ο蠓治觯∣bject Oriented Analysis,OOA)、面向?qū)ο笤O(shè)計(Object Oriented Design,OOD),以及面向?qū)ο缶幊蹋∣bject Oriented Programming)沪么。面向?qū)ο缶幊痰膬蓚€中個重要的概念是類和對象硼婿。
面向?qū)ο蟮娜筇卣?/h3>
- 封裝性
把相同的屬性和方法抽象成一個類叫做封裝
- 繼承性
子類繼承父類的屬性和方法叫做繼承。我們可以重寫和添加新的屬性方法禽车。在PHP 中支持的是單繼承寇漫。一個子類有且只有一個父類。
- 多態(tài)性
同一個類的不同對象,調(diào)用同一個方法可以獲得不同的結(jié)果叫多態(tài)(增強程序的靈活性和重用性)
PHP 對象
類的定義
把相同的屬性和方法抽象成一個類叫做封裝
子類繼承父類的屬性和方法叫做繼承。我們可以重寫和添加新的屬性方法禽车。在PHP 中支持的是單繼承寇漫。一個子類有且只有一個父類。
同一個類的不同對象,調(diào)用同一個方法可以獲得不同的結(jié)果叫多態(tài)(增強程序的靈活性和重用性)
PHP 通過 class 關(guān)鍵字加類名來定義類
<?php
class Person{
}
?>
成員方法
類中的函數(shù)被稱為成員方法
<?php
class Person{
function man(){
}
}
?>
類的實例化
通過 new 關(guān)鍵字 實例化對象殉摔,通過對象->成員方法 來調(diào)用成員方法州胳。
class Per{
function man($name, $age)
{
echo $name;
echo $age;
}
}
$m1 = new Per();
echo $m1->man('小明','22');
成員變量
類中的變量,也稱為成員變量逸月。有些人也把它叫做屬性或者字段栓撞。成員變量的是用來保存數(shù)據(jù)信息。(訪問成員變量和成員方法的方法一樣碗硬,對象->成員變量)
定義成員變量和成員方法:
<?php
class Per{
// 聲明成員變量
// 關(guān)鍵字(修飾符) 成員變量名
// 關(guān)鍵字有public ,private, protected, static
public $name;
public $age;
public $money;
public function man($name, $age,$money){
echo $name.'今年'.$age.'工資是'.$money;
}
}
$m1 = new Per();
$m1->man('小明',22,4000);
?>
類常量
常量是不可改變的量,是一個恒值,舉例圓周率就是一個常量瓤湘。使用關(guān)鍵字 const定義常量。
class Per{
// 通常常量用大寫字母
const WORK='搬磚';
}
echo Per::WORK;
構(gòu)造函數(shù)和析構(gòu)函數(shù)
構(gòu)造函數(shù)
當(dāng)一個類實例化為一個對象的時候恩尾,可能可能會隨著對象的初始化而初始化一些成員變量岭粤。就是給一些成員變量賦值。這種情況下我們就可以使用構(gòu)造函數(shù)特笋。因為對象實例化過程中構(gòu)造函數(shù)是自動執(zhí)行的。
析構(gòu)函數(shù)
析構(gòu)函數(shù)的作用和構(gòu)造方法方法剛好相反巾兆,是對象被銷毀時被調(diào)用的猎物,作用是釋放內(nèi)存。
<?php
class Person
{
// 公共成員變量名
public $name;
public $age;
public $sex;
public $type = "人類";
// 構(gòu)造函數(shù)
// 原來給成員變量賦值
// 在對象開始實例化的時候 自動執(zhí)行
public function __construct($name, $age, $sex)
{
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
//析構(gòu)函數(shù) 在對象被銷毀的時候 自動執(zhí)行
public function __destruct()
{
echo "$this->type.對象被銷毀,已釋放";
}
}
$p1 = new Person('小龍', 18, 0);
print_r($p1);
繼承和多態(tài)
繼承
子類繼承父類的所有成員變量方法角塑,包括構(gòu)造方法蔫磨,當(dāng)子類被實例化的時候,PHP 會先在子類當(dāng)中找構(gòu)造方法圃伶,如果子類已經(jīng)有自己的構(gòu)造方法堤如。PHP 會先調(diào)用子類的方法蒲列。當(dāng)子類當(dāng)中沒有的時候,PHP 才會去調(diào)用搀罢。父類當(dāng)中的構(gòu)造方法蝗岖,這就是繼承。
<?php
class Person
{
// 公共成員變量名
public $name;
public $age;
public $sex;
}
// 繼承
// 將person當(dāng)成父類
// man繼承父類 person 的屬性和方法
class Man extends Person
{
public function money()
{
echo '小龍賺錢';
}
}
$m1 = new Man('小劉', 23, 1);
$m1->money();
多態(tài)
<?php
class Animal
{
public $name;
public $sound;
public function say(){
echo $this->sound;
}
public function __construct($name1,$sound){
$this->name=$name1;
$this->sound=$sound;
}
}
class Dog extends Animal{
}
class Cat extends Animal{
}
class Sheep extends Animal{
}
function asay($obj) {
$obj->say();
}
$m1=new Dog('貓貓','喵喵');
$m2=new Cat('狗狗','汪汪汪');
$m3=new Sheep('羊羊','咩咩咩');
asay($m1);
asay($m2);
asay($m3);
操作符
PHP通過為變量this->和域的操作符"::"來訪問自己的成員變量和成員方法
- this->
在類內(nèi)部我們可以通過this訪問當(dāng)前實例化對象榔至,調(diào)用方法或成員變量的話則使用 "this->成員變量" 抵赢、 "this->成員方法" 來訪問。所以 this-> 只在類的內(nèi)部使用
-操作符::
$this只能在類的內(nèi)部去使用唧取。操作符"::"可以在沒有聲明任何實例的情況下铅鲤,訪問類當(dāng)中的成員方法或成員變量。(關(guān)鍵字::變量名/常量名/方法名
)
parent: 可以調(diào)用父類中的 成員變量枫弟,成員方法和常量
self:可以調(diào)用當(dāng)前類中的 靜態(tài)成員和常量
類名:可以調(diào)用本類中的靜態(tài)變量邢享,常量和靜態(tài)方法
<?php
//A 類
class A
{
const Type = 0;
const NAME = "A";
function a(){
// echo self::Type.self::NAME;//0,A
// echo "<br>";
}
}
class B extends A
{
// 子類獨有的方法
const Type = 1;
const NAME = "B";
public function a()
{
// echo parent::Type .parent::NAME;//0,A
// echo "<br>";
// echo self::Type.parent::NAME;//1,A
}
}
$a1 = new A();
$b1 = new B();
$a1->a();
$b1->a();
修飾符
public、private淡诗、protected骇塘、static和final。這些關(guān)鍵字是用來限定類成員(包括方法和變量)的訪問權(quán)限袜漩。
public(公共成員)
- 在類的內(nèi)部 可以使用
- 在類的外部 可以使用
- 在子類的內(nèi)部 可以使用
<?php
class Per
{
public $name = "小龍";
public function fn()
{
// 1.可以在類的內(nèi)部訪問绪爸,對當(dāng)前類的 內(nèi)部可見
echo $this->name;
}
}
class Students extends Per
{
public function fn1()
{
// 2.可以在子類的內(nèi)部訪問,對子類的內(nèi)部可見
$this->fn();
}
}
// 3.在類的外部可見
echo $s1->name;
$s1 = new Per();
// $s1->fn();//在類的內(nèi)部訪問
$s2 = new Students();
// $s2->fn1();//可以在子類的內(nèi)部訪問
private(私有成員)
1.在類的內(nèi)部 可以使用
2.在子類的內(nèi)部 不能使用
3.在類的外部 不能使用
class Book{
private $name='HTML';
public function setName($name){
// 1.在當(dāng)前類內(nèi)部 可訪問
$this->name=$name;
echo $name;
}
public function getName(){
echo $this->name;
}
private function c1(){
echo '123';
}
}
class Histoty extends Book{
public function getBookName(){
// 2.在子類內(nèi)部不可見 不可訪問繼承來的父類中的私有成員變量 私有方法
echo $this->name;
// $this->c1();
}
}
$b1=new Book;
// $b1->setName('測試');//在當(dāng)前類內(nèi)部 可訪問
// 3.在類的外部不可訪問 私有成員變量或私有成員方法
// echo $b1->name;//在類的外部 不能訪問
// $b1->name='js';//在類的外部 不能使用
$h1=new Histoty();
$h1->getBookName();//在子類的內(nèi)部 不能使用
protected(保護成員)
- 在類的內(nèi)部 可以使用
- 在子類的內(nèi)部 可以使用
- 在類的外部 不能使用
<?php
class Per{
protected $money=100000;
public function fn(){
echo $this->money;
// 1.在當(dāng)前的內(nèi)部可以訪問
}
}
class Xs extends Per{
public function fn1(){
echo $this->money;
// 2. 可以在子類的內(nèi)部訪問
}
}
// 3. 在類的外部不能直接訪問宙攻,
$p1=new Per();
// $p1->fn();//在類的內(nèi)部 可以使用
// echo $p1->money;//在類的外部 不能使用
$s1=new Xs();
$s1->fn1();//在子類的內(nèi)部 可以使用
final 關(guān)鍵字
<?php
// final 被修飾過的類是最終版本
class A{
public function aa(){
echo 'aa' ;
}
public function _construct(){
$this->aa();
}
}
final class B extends A{
public function aa(){
echo "bb";
}
// 被final 修飾過的方法 不能在子類中被重寫
}
// 被final 修飾過的 類不能被繼承
class C extends B{}
$c1= new C();
$c1->aa();
// $b1=new B();
// $b1->aa();//被final 修飾過的方法 不能在子類中被重寫
靜態(tài)成員(變量奠货,方法)
不是所有的方法都要通過創(chuàng)建對象來去調(diào)用的,我們可以座掘。通過給變量或者方法加上static關(guān)鍵字來直接調(diào)用递惋。也叫做訪問靜態(tài)成員
<?php
class Book{
static $num=0;//聲明一個靜態(tài)變量$num,初始值為0;
public function showMe(){
echo '您是第'.self::$num.'位訪客';
self::$num++;//
}
}
$b1=new Book();
$b1->showMe();
echo '一共有'.Book::$num.'位訪客';