解析如下:類(lèi)使用 class 關(guān)鍵字后加上類(lèi)名定義。類(lèi)名后的一對(duì)大括號(hào)({})內(nèi)可以定義變量和方法。類(lèi)的變量使用 var 來(lái)聲明, 變量也可以初始化值。函數(shù)定義類(lèi)似 PHP 函數(shù)的定義,但函數(shù)只能通過(guò)該類(lèi)及其實(shí)例化的對(duì)象訪問(wèn)實(shí)例變量 $this 代表自身的對(duì)象。PHP_EOL 為換行符。">

亚洲激情中文字幕_精品日韩一区二区三区_国产黄大片_成人综合网站_精品久久av_中文字幕一区二区三区乱码在线

您現(xiàn)在的位置是:首頁(yè) >php教程 >php教程十五 面向?qū)ο?/span>網(wǎng)站首頁(yè)php教程

php教程十五 面向?qū)ο?/h3>
三只小菜猿 2023-02-07 09:48:29
簡(jiǎn)介?php>解析如下:類(lèi)使用 class 關(guān)鍵字后加上類(lèi)名定義。類(lèi)名后的一對(duì)大括號(hào)({})內(nèi)可以定義變量和方法。類(lèi)的變量使用 var 來(lái)聲明, 變量也可以初始化值。函數(shù)定義類(lèi)似 PHP 函數(shù)的定義,但函數(shù)只能通過(guò)該類(lèi)及其實(shí)例化的對(duì)象訪問(wèn)實(shí)例變量 $this 代表自身的對(duì)象。PHP_EOL 為換行符。

PHP 面向?qū)ο?/span>

在面向?qū)ο蟮某绦蛟O(shè)計(jì)(英語(yǔ):Object-oriented programming,縮寫(xiě):OOP)中,對(duì)象是一個(gè)由信息及對(duì)信息進(jìn)行處理的描述所組成的整體,是對(duì)現(xiàn)實(shí)世界的抽象。

在現(xiàn)實(shí)世界里我們所面對(duì)的事情都是對(duì)象,如計(jì)算機(jī)、電視機(jī)、自行車(chē)等。

對(duì)象的主要三個(gè)特性

對(duì)象的行為:可以對(duì) 對(duì)象施加那些操作,開(kāi)燈,關(guān)燈就是行為。

對(duì)象的形態(tài):當(dāng)施加那些方法是對(duì)象如何響應(yīng),顏色,尺寸,外型。

對(duì)象的表示:對(duì)象的表示就相當(dāng)于身份證,具體區(qū)分在相同的行為與狀態(tài)下有什么不同。

比如 Animal(動(dòng)物) 是一個(gè)抽象類(lèi),我們可以具體到一只狗跟一只羊,而狗跟羊就是具體的對(duì)象,他們有顏色屬性,可以寫(xiě),可以跑等行為狀態(tài)。

在這里插入圖片描述在這里插入圖片描述

面向?qū)ο髢?nèi)容

類(lèi) ? 定義了一件事物的抽象特點(diǎn)。類(lèi)的定義包含了數(shù)據(jù)的形式以及對(duì)數(shù)據(jù)的操作。

對(duì)象 ? 是類(lèi)的實(shí)例。

成員變量 ? 定義在類(lèi)內(nèi)部的變量。該變量的值對(duì)外是不可見(jiàn)的,但是可以通過(guò)成員函數(shù)訪問(wèn),在類(lèi)被實(shí)例化為對(duì)象后,該變量即可成為對(duì)象的屬性。

成員函數(shù) ? 定義在類(lèi)的內(nèi)部,可用于訪問(wèn)對(duì)象的數(shù)據(jù)。

繼承 ? 繼承性是子類(lèi)自動(dòng)共享父類(lèi)數(shù)據(jù)結(jié)構(gòu)和方法的機(jī)制,這是類(lèi)之間的一種關(guān)系。在定義和實(shí)現(xiàn)一個(gè)類(lèi)的時(shí)候,可以在一個(gè)已經(jīng)存在的類(lèi)的基礎(chǔ)之上來(lái)進(jìn)行,把這個(gè)已經(jīng)存在的類(lèi)所定義的內(nèi)容作為自己的內(nèi)容,并加入若干新的內(nèi)容。

父類(lèi) ? 一個(gè)類(lèi)被其他類(lèi)繼承,可將該類(lèi)稱(chēng)為父類(lèi),或基類(lèi),或超類(lèi)。

子類(lèi) ? 一個(gè)類(lèi)繼承其他類(lèi)稱(chēng)為子類(lèi),也可稱(chēng)為派生類(lèi)。

多態(tài) ? 多態(tài)性是指相同的函數(shù)或方法可作用于多種類(lèi)型的對(duì)象上并獲得不同的結(jié)果。不同的對(duì)象,收到同一消息可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱(chēng)為多態(tài)性。

重載 ? 簡(jiǎn)單說(shuō),就是函數(shù)或者方法有同樣的名稱(chēng),但是參數(shù)列表不相同的情形,這樣的同名不同參數(shù)的函數(shù)或者方法之間,互相稱(chēng)之為重載函數(shù)或者方法。

抽象性 ? 抽象性是指將具有一致的數(shù)據(jù)結(jié)構(gòu)(屬性)和行為(操作)的對(duì)象抽象成類(lèi)。一個(gè)類(lèi)就是這樣一種抽象,它反映了與應(yīng)用有關(guān)的重要性質(zhì),而忽略其他一些無(wú)關(guān)內(nèi)容。任何類(lèi)的劃分都是主觀的,但必須與具體的應(yīng)用有關(guān)。

封裝 ? 封裝是指將現(xiàn)實(shí)世界中存在的某個(gè)客體的屬性與行為綁定在一起,并放置在一個(gè)邏輯單元內(nèi)。

構(gòu)造函數(shù) ? 主要用來(lái)在創(chuàng)建對(duì)象時(shí)初始化對(duì)象, 即為對(duì)象成員變量賦初始值,總與new運(yùn)算符一起使用在創(chuàng)建對(duì)象的語(yǔ)句中。

析構(gòu)函數(shù) ? 析構(gòu)函數(shù)(destructor) 與構(gòu)造函數(shù)相反,當(dāng)對(duì)象結(jié)束其生命周期時(shí)(例如對(duì)象所在的函數(shù)已調(diào)用完畢),系統(tǒng)自動(dòng)執(zhí)行析構(gòu)函數(shù)。析構(gòu)函數(shù)往往用來(lái)做"清理善后" 的工作(例如在建立對(duì)象時(shí)用new開(kāi)辟了一片內(nèi)存空間,應(yīng)在退出前在析構(gòu)函數(shù)中用delete釋放)。

下圖中我們通過(guò) Car 類(lèi) 創(chuàng)建了三個(gè)對(duì)象:Mercedes, Bmw, 和 Audi。

$mercedes = new Car ();

$bmw = new Car ();

$audi = new Car ();


在這里插入圖片描述在這里插入圖片描述

PHP 類(lèi)定義

PHP 定義類(lèi)通常語(yǔ)法格式如下:

<?php
class phpClass {
  var $var1;
  var $var2 = "constant string";
  
  function myfunc ($arg1$arg2) {
     [..]
  }
  [..]
}
?>

解析如下:

類(lèi)使用 class 關(guān)鍵字后加上類(lèi)名定義。

類(lèi)名后的一對(duì)大括號(hào)({})內(nèi)可以定義變量和方法。

類(lèi)的變量使用 var 來(lái)聲明, 變量也可以初始化值。

函數(shù)定義類(lèi)似 PHP 函數(shù)的定義,但函數(shù)只能通過(guò)該類(lèi)及其實(shí)例化的對(duì)象訪問(wèn)

實(shí)例

<?php
class Site {
  /* 成員變量 */
  var $url;
  var $title;
  
  /* 成員函數(shù) */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}
?>

變量 $this 代表自身的對(duì)象。 PHP_EOL 為換行符。

PHP 中創(chuàng)建對(duì)象

類(lèi)創(chuàng)建后,我們可以使用 new 運(yùn)算符來(lái)實(shí)例化該類(lèi)的對(duì)象:

$dyf = new Site;

$taobao = new Site;

$google = new Site;


以上代碼我們創(chuàng)建了三個(gè)對(duì)象,三個(gè)對(duì)象各自都是獨(dú)立的,接下來(lái)我們來(lái)看看如何訪問(wèn)成員方法與成員變量。

調(diào)用成員方法 在實(shí)例化對(duì)象后,我們可以使用該對(duì)象調(diào)用成員方法,該對(duì)象的成員方法只能操作該對(duì)象的成員變量:

 // 調(diào)用成員函數(shù),設(shè)置標(biāo)題和URL 

 $dyf->setTitle( "dyf" ); 

 $taobao->setTitle( "淘寶" );

 $google->setTitle( "Google " );

 

 $dyf->setUrl( 'www.dyf.com' ); 

 $taobao->setUrl( 'www.taobao.com' );

 $google->setUrl( 'www.google.com' );

 

 // 調(diào)用成員函數(shù),獲取標(biāo)題和URL 

 $dyf->getTitle(); 

 $taobao->getTitle();

 $google->getTitle();

 

 $dyf->getUrl();

  $taobao->getUrl(); 

  $google->getUrl();


完整代碼如下:

<?php
class Site {
  /* 成員變量 */
  var $url;
  var $title;
  
  /* 成員函數(shù) */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}

$baidu= new Site;
$taobao = new Site;
$google = new Site;

// 調(diào)用成員函數(shù),設(shè)置標(biāo)題和URL
$baidu->setTitle( "百度" );
$taobao->setTitle( "淘寶" );
$google->setTitle( "Google 搜索" );

$baidu->setUrl( 'www.baidu.com' );
$taobao->setUrl( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );

// 調(diào)用成員函數(shù),獲取標(biāo)題和URL
$baidu->getTitle();
$taobao->getTitle();
$google->getTitle();

$baidu->getUrl();
$taobao->getUrl();
$google->getUrl();
?>

執(zhí)行以上代碼,輸出結(jié)果為:

百度 淘寶 Google 搜索 www.baidu.com www.taobao.com www.google.com

PHP 構(gòu)造函數(shù)

構(gòu)造函數(shù)是一種特殊的方法。主要用來(lái)在創(chuàng)建對(duì)象時(shí)初始化對(duì)象, 即為對(duì)象成員變量賦初始值,在創(chuàng)建對(duì)象的語(yǔ)句中與 new 運(yùn)算符一起使用。

PHP 5 允許開(kāi)發(fā)者在一個(gè)類(lèi)中定義一個(gè)方法作為構(gòu)造函數(shù),語(yǔ)法格式如下:

void __construct ([ mixed $args [, $... ]] )

在上面的例子中我們就可以通過(guò)構(gòu)造方法來(lái)初始化 和???和title 變量:

function __construct( $par1, $par2 ) {

   $this->url = $par1;

   $this->title = $par2;

}


現(xiàn)在我們就不需要再調(diào)用 setTitle 和 setUrl 方法了:

$baidu= new Site('www.baidu.com''百度');
$taobao = new Site('www.taobao.com''淘寶');
$google = new Site('www.google.com''Google 搜索');

// 調(diào)用成員函數(shù),獲取標(biāo)題和URL
$baidu->getTitle();
$taobao->getTitle();
$google->getTitle();

$baidu->getUrl();
$taobao->getUrl();
$google->getUrl();

析構(gòu)函數(shù)

析構(gòu)函數(shù)(destructor) 與構(gòu)造函數(shù)相反,當(dāng)對(duì)象結(jié)束其生命周期時(shí)(例如對(duì)象所在的函數(shù)已調(diào)用完畢),系統(tǒng)自動(dòng)執(zhí)行析構(gòu)函數(shù)。

PHP 5 引入了析構(gòu)函數(shù)的概念,這類(lèi)似于其它面向?qū)ο蟮恼Z(yǔ)言,其語(yǔ)法格式如下:

void __destruct ( void )

實(shí)例

<?php
class MyDestructableClass {
   function __construct() {
       print "構(gòu)造函數(shù) ";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "銷(xiāo)毀 " . $this->name . " ";
   }
}

$obj = new MyDestructableClass();
?>

執(zhí)行以上代碼,輸出結(jié)果為:

構(gòu)造函數(shù) 銷(xiāo)毀 MyDestructableClass

繼承

PHP 使用關(guān)鍵字 extends 來(lái)繼承一個(gè)類(lèi),PHP 不支持多繼承,格式如下:

class Child extends Parent { // 代碼部分 }

實(shí)例

實(shí)例中 Child_Site 類(lèi)繼承了 Site 類(lèi),并擴(kuò)展了功能:

<?php 
// 子類(lèi)擴(kuò)展站點(diǎn)類(lèi)別
class Child_Site extends Site {
   var $category;

    function setCate($par){
        $this->category = $par;
    }
  
    function getCate(){
        echo $this->category . PHP_EOL;
    }
}

方法重寫(xiě)

如果從父類(lèi)繼承的方法不能滿(mǎn)足子類(lèi)的需求,可以對(duì)其進(jìn)行改寫(xiě),這個(gè)過(guò)程叫方法的覆蓋(override),也稱(chēng)為方法的重寫(xiě)。

實(shí)例中重寫(xiě)了 getUrl 與 getTitle 方法:

function getUrl() {

   echo $this->url . PHP_EOL;

   return $this->url;

}  

function getTitle(){

   echo $this->title . PHP_EOL;

   return $this->title;

}


訪問(wèn)控制

PHP 對(duì)屬性或方法的訪問(wèn)控制,是通過(guò)在前面添加關(guān)鍵字 public(公有),protected(受保護(hù))或 private(私有)來(lái)實(shí)現(xiàn)的。

public(公有):公有的類(lèi)成員可以在任何地方被訪問(wèn)。 protected(受保護(hù)):受保護(hù)的類(lèi)成員則可以被其自身以及其子類(lèi)和父類(lèi)訪問(wèn)。 private(私有):私有的類(lèi)成員則只能被其定義所在的類(lèi)訪問(wèn)。

屬性的訪問(wèn)控制

類(lèi)屬性必須定義為公有,受保護(hù),私有之一。如果用 var 定義,則被視為公有。

<?php
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // 這行能被正常執(zhí)行
echo $obj->protected; // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤
echo $obj->private; // 這行也會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤
$obj->printHello(); // 輸出 Public、Protected 和 Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 可以對(duì) public 和 protected 進(jìn)行重定義,但 private 而不能
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // 這行能被正常執(zhí)行
echo $obj2->private; // 未定義 private
echo $obj2->protected; // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤
$obj2->printHello(); // 輸出 Public、Protected2 和 Undefined

?>

方法的訪問(wèn)控制

類(lèi)中的方法可以被定義為公有,私有或受保護(hù)。如果沒(méi)有設(shè)置這些關(guān)鍵字,則該方法默認(rèn)為公有。

<?php
/**
 * Define MyClass
 */
class MyClass
{
    // 聲明一個(gè)公有的構(gòu)造函數(shù)
    public function __construct() { }

    // 聲明一個(gè)公有的方法
    public function MyPublic() { }

    // 聲明一個(gè)受保護(hù)的方法
    protected function MyProtected() { }

    // 聲明一個(gè)私有的方法
    private function MyPrivate() { }

    // 此方法為公有
    function Foo()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}

$myclass = new MyClass;
$myclass->MyPublic(); // 這行能被正常執(zhí)行
$myclass->MyProtected(); // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤
$myclass->MyPrivate(); // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤
$myclass->Foo(); // 公有,受保護(hù),私有都可以執(zhí)行


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 此方法為公有
    function Foo2()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤
    }
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 這行能被正常執(zhí)行
$myclass2->Foo2(); // 公有的和受保護(hù)的都可執(zhí)行,但私有的不行

class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic ";
    }
    
    private function testPrivate() {
        echo "Bar::testPrivate ";
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic ";
    }
    
    private function testPrivate() {
        echo "Foo::testPrivate ";
    }
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate 
                // Foo::testPublic
?>

接口

使用接口(interface),可以指定某個(gè)類(lèi)必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。

接口是通過(guò) interface 關(guān)鍵字來(lái)定義的,就像定義一個(gè)標(biāo)準(zhǔn)的類(lèi)一樣,但其中定義所有的方法都是空的。

接口中定義的所有方法都必須是公有,這是接口的特性。

要實(shí)現(xiàn)一個(gè)接口,使用 implements 操作符。類(lèi)中必須實(shí)現(xiàn)接口中定義的所有方法,否則會(huì)報(bào)一個(gè)致命錯(cuò)誤。類(lèi)可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來(lái)分隔多個(gè)接口的名稱(chēng)。

<?php

// 聲明一個(gè)'iTemplate'接口
interface iTemplate
{
    public function setVariable($name$var);
    public function getHtml($template);
}


// 實(shí)現(xiàn)接口
class Template implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name$var)
    {
        $this->vars[$name] = $var;
    }
  
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}'$value$template);
        }
 
        return $template;
    }
}

常量

可以把在類(lèi)中始終保持不變的值定義為常量。在定義和使用常量的時(shí)候不需要使用 $ 符號(hào)。

常量的值必須是一個(gè)定值,不能是變量,類(lèi)屬性,數(shù)學(xué)運(yùn)算的結(jié)果或函數(shù)調(diào)用。

自 PHP 5.3.0 起,可以用一個(gè)變量來(lái)動(dòng)態(tài)調(diào)用類(lèi)。但該變量的值不能為關(guān)鍵字(如 self,parent 或 static)。

實(shí)例

<?php
class MyClass
{
    const constant = '常量值';

    function showConstant() {
        echo  self::constant . PHP_EOL;
    }
}

echo MyClass::constant . PHP_EOL;

$classname = "MyClass";
echo $classname::constant . PHP_EOL; // 自 5.3.0 起

$class = new MyClass();
$class->showConstant();

echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
?>

抽象類(lèi)

任何一個(gè)類(lèi),如果它里面至少有一個(gè)方法是被聲明為抽象的,那么這個(gè)類(lèi)就必須被聲明為抽象的。

定義為抽象的類(lèi)不能被實(shí)例化。

被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實(shí)現(xiàn)。

繼承一個(gè)抽象類(lèi)的時(shí)候,子類(lèi)必須定義父類(lèi)中的所有抽象方法;另外,這些方法的訪問(wèn)控制必須和父類(lèi)中一樣(或者更為寬松)。例如某個(gè)抽象方法被聲明為受保護(hù)的,那么子類(lèi)中實(shí)現(xiàn)的方法就應(yīng)該聲明為受保護(hù)的或者公有的,而不能定義為私有的。

<?php
abstract class AbstractClass
{
 // 強(qiáng)制要求子類(lèi)定義這些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>

執(zhí)行以上代碼,輸出結(jié)果為:

ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2

此外,子類(lèi)方法可以包含父類(lèi)抽象方法中不存在的可選參數(shù)。

例如,子類(lèi)定義了一個(gè)可選參數(shù),而父類(lèi)抽象方法的聲明里沒(méi)有,則也是可以正常運(yùn)行的。

<?php
abstract class AbstractClass
{
    // 我們的抽象方法僅需要定義需要的參數(shù)
    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{

    // 我們的子類(lèi)可以定義父類(lèi)簽名中不存在的可選參數(shù)
    public function prefixName($name$separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), " ";
echo $class->prefixName("Pacwoman"), " ";
?>

輸出結(jié)果為:

Mr. Pacman Mrs. Pacwoman

Static 關(guān)鍵字

聲明類(lèi)屬性或方法為 static(靜態(tài)),就可以不實(shí)例化類(lèi)而直接訪問(wèn)。

靜態(tài)屬性不能通過(guò)一個(gè)類(lèi)已實(shí)例化的對(duì)象來(lái)訪問(wèn)(但靜態(tài)方法可以)。

由于靜態(tài)方法不需要通過(guò)對(duì)象即可調(diào)用,所以偽變量 $this 在靜態(tài)方法中不可用。

靜態(tài)屬性不可以由對(duì)象通過(guò) -> 操作符來(lái)訪問(wèn)。

自 PHP 5.3.0 起,可以用一個(gè)變量來(lái)動(dòng)態(tài)調(diào)用類(lèi)。但該變量的值不能為關(guān)鍵字 self,parent 或 static。

<?php
class Foo {
  public static $my_static = 'foo';
  
  public function staticValue() {
     return self::$my_static;
  }
}

print Foo::$my_static . PHP_EOL;
$foo = new Foo();

print $foo->staticValue() . PHP_EOL;
?>    

執(zhí)行以上程序,輸出結(jié)果為:

foo foo

Final 關(guān)鍵字

PHP 5 新增了一個(gè) final 關(guān)鍵字。如果父類(lèi)中的方法被聲明為 final,則子類(lèi)無(wú)法覆蓋該方法。如果一個(gè)類(lèi)被聲明為 final,則不能被繼承。

以下代碼執(zhí)行會(huì)報(bào)錯(cuò):

<?php
class BaseClass {
   public function test() {
       echo "BaseClass::test() called" . PHP_EOL;
   }
   
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called"  . PHP_EOL;
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called"  . PHP_EOL;
   }
}
// 報(bào)錯(cuò)信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>

調(diào)用父類(lèi)構(gòu)造方法

PHP 不會(huì)在子類(lèi)的構(gòu)造方法中自動(dòng)的調(diào)用父類(lèi)的構(gòu)造方法。要執(zhí)行父類(lèi)的構(gòu)造方法,需要在子類(lèi)的構(gòu)造方法中調(diào)用 parent::__construct() 。

<?php
class BaseClass {
   function __construct() {
       print "BaseClass 類(lèi)中構(gòu)造方法" . PHP_EOL;
   }
}
class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();  // 子類(lèi)構(gòu)造方法不能自動(dòng)調(diào)用父類(lèi)的構(gòu)造方法
       print "SubClass 類(lèi)中構(gòu)造方法" . PHP_EOL;
   }
}
class OtherSubClass extends BaseClass {
    // 繼承 BaseClass 的構(gòu)造方法
}

// 調(diào)用 BaseClass 構(gòu)造方法
$obj = new BaseClass();

// 調(diào)用 BaseClass、SubClass 構(gòu)造方法
$obj = new SubClass();

// 調(diào)用 BaseClass 構(gòu)造方法
$obj = new OtherSubClass();
?>

執(zhí)行以上程序,輸出結(jié)果為:

BaseClass 類(lèi)中構(gòu)造方法 BaseClass 類(lèi)中構(gòu)造方法 SubClass 類(lèi)中構(gòu)造方法 BaseClass 類(lèi)中構(gòu)造方法

說(shuō)下繼承,子類(lèi)繼承父類(lèi)的屬性和方法,也就是說(shuō)子類(lèi)擁有父類(lèi)所有的東西,包括 public(公有)、protected(保護(hù))和private(私有)的。但是父類(lèi)私有的屬性和方法不能讓子類(lèi)直接調(diào)用,并不是說(shuō)沒(méi)有繼承過(guò)來(lái),而是繼承過(guò)來(lái)了,但是要調(diào)用父類(lèi)的私有屬性和方法的話還是需要通過(guò)父類(lèi)的 public、protected 方法調(diào)用。

<?php

class father {

    public function __construct(){
        echo "父類(lèi)構(gòu)造函數(shù),如果子類(lèi)沒(méi)有重寫(xiě)構(gòu)造函數(shù)將會(huì)調(diào)用這里。如果子類(lèi)重寫(xiě)了構(gòu)造函數(shù)則子類(lèi)不用自動(dòng)調(diào)用這個(gè)函數(shù),而需要顯示調(diào)用父類(lèi)構(gòu)造函數(shù)。";
    }

    public $m_fa="fa";
    protected $m_fb="fb";
    private $m_fc="fc";

    public function getFa(){return $m_fa;}
    protected function getFb(){return $m_fb;}
    private function getFc(){return $m_fc;}
    public function getFaPrivate_1(){return $m_fc;}
    public function getFaPrivate_2(){return $m_fc;}

    public function getAll(){
        echo $this->m_fa, $this->m_fb, $this->m_fc;
        echo  $this->getFa(), $this->getFb(), $this->getFc();
    }

}

class son extends father{
    public function __construct(){
        parent::__construct(); //顯示調(diào)用父類(lèi)構(gòu)造函數(shù)。
        echo "子類(lèi)構(gòu)造函數(shù)調(diào)用";
    }
}

$class_fa = 'father';
$class_son = 'son';
$fa = new $class_fa();
$fa->getAll();
$son = new $class_son();
$son->getFa();
// 執(zhí)行以下方法回報(bào)錯(cuò),protected 無(wú)法在類(lèi)外面進(jìn)行調(diào)用的
// 報(bào)錯(cuò)信息:Fatal error: Uncaught Error: Call to protected method father::getFb()...
// $son->getFb();
// 執(zhí)行以下方法回報(bào)錯(cuò),private 無(wú)法被繼承,也無(wú)法在類(lèi)外面進(jìn)行調(diào)用的
// 報(bào)錯(cuò)信息:Fatal error: Uncaught Error: Call to private method father::getFc()...
// $son->getFc();

$son->getFaPrivate_2();
?>

子類(lèi)繼承帶有參數(shù)的父類(lèi)的構(gòu)造方法:

class students{
    var $name,$age,$sex;
    function __construct($name,$age,$sex){
        $this->name = $name;
        $this->age = $age;
        $this->sex = $sex;
    }
}

class master extends students{
    var $hobby,$address;
    function __construct($name$age$sex,$hobby,$address){
        parent::__construct($name$age$sex);
        $this->hobby = $hobby;
        $this->address = $address;
    }
}


夢(mèng)想加空間!平時(shí)喜歡研究各種技術(shù),目前在從事后端開(kāi)發(fā)工作,熱愛(ài)生活、熱愛(ài)工作。
主站蜘蛛池模板: 视频一区二区三区视频 | 久久精品一区二区三区不卡牛牛 | 成人富二代短视频 | 日夜操天天干 | 中文字幕在线观看成人 | 久久久国产精品视频 | av在线在线 | 成人久久久精品国产乱码一区二区 | 蜜桃久久一区二区三区 | 国产高清自拍一区 | 色99999| 香蕉在线看 | 国产91在线免费 | 国产精品视频在 | 久久久婷婷| 最新影院| 被日视频 | 久久精品欧美一区 | 成熟女人特级毛片www免费 | 49vvv| 一级做受毛片免费大片 | 久久一级| 羞羞的视频在线观看 | 欧洲成人精品 | 亚洲影视在线观看 | hdhdhdhd19日本人 | 午夜视频免费播放 | 一级片免费在线播放 | 天堂在线中文资源 | 国产成年人视频网站 | 91精品国产99久久久久久 | 羞羞的动漫在线观看 | 国产精品久久久久久久久久东京 | 午夜久久久精品一区二区三区 | 日韩1区 | 黄网站色成年大片免费高 | 国产精品1区 | 激情网站免费观看 | 特级毛片免费视频 | 91看片在线观看视频 | 日本一区二区三区视频在线 |