婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【接口、抽象類(lèi)、靜態(tài)方法等】

PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【接口、抽象類(lèi)、靜態(tài)方法等】

熱門(mén)標(biāo)簽:電銷(xiāo)機(jī)器人沒(méi)有效果怎么樣 天潤(rùn)融通外呼系統(tǒng)好嗎 泊頭在哪里辦理400電話 江門(mén)回?fù)芡夂粝到y(tǒng) 欣思維地圖標(biāo)注 高德地圖標(biāo)注店鋪收費(fèi)嗎 杭州語(yǔ)音電銷(xiāo)機(jī)器人 高德地圖標(biāo)注位置怎么標(biāo)注 江西電銷(xiāo)機(jī)器人收費(fèi)

本文實(shí)例講述了PHP面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)。分享給大家供大家參考,具體如下:

我們可以使用接口(interface),指定某個(gè)類(lèi)必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容,我們可以通過(guò) interface 關(guān)鍵字來(lái)定義,就像定義一個(gè)標(biāo)準(zhǔn)的類(lèi)一樣,但其中定義所有的方法都是空的,但是其中定義的所有方法都必須是公有,這是接口的特性。

但是我們?nè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),是不是很神奇???來(lái)看實(shí)例感受下:

?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),來(lái)看實(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 起
?>

任何一個(gè)類(lèi),如果它里面至少有一個(gè)方法是被聲明為抽象的,那么這個(gè)類(lèi)就必須被聲明為抽象的,并且,定義為抽象的類(lèi)不能被實(shí)例化,完事呢,被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實(shí)現(xiàn),這是抽象類(lèi)的一些公知的概念。

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

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

輸出結(jié)果為:

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

我們還要記得,子類(lèi)方法可以包含父類(lèi)抽象方法中不存在的可選參數(shù),舉個(gè)栗子,例如,子類(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"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>

輸出結(jié)果為:

Mr. Pacman
Mrs. Pacwoman

聲明類(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)方法中不可用,也就是說(shuō),靜態(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,實(shí)例如下:

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

輸出結(jié)果如下:

foo
foo

PHP 5 新增了一個(gè) final 關(guān)鍵字,它的作用就是,如果父類(lèi)中的方法被聲明為 final,則子類(lèi)無(wú)法覆蓋該方法,如果一個(gè)類(lèi)被聲明為 final,則不能被繼承,如下案例,會(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()
?>

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

輸出結(jié)果為:

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

好啦,本次記錄就到這里了。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之接口的繼承定義與用法詳解
  • PHP面向?qū)ο笪宕笤瓌t之接口隔離原則(ISP)詳解
  • PHP面向?qū)ο蟪绦蛟O(shè)計(jì)高級(jí)特性詳解(接口,繼承,抽象類(lèi),析構(gòu),克隆等)
  • PHP入門(mén)教程之面向?qū)ο蟮奶匦苑治?繼承,多態(tài),接口,抽象類(lèi),抽象方法等)
  • PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之接口用法
  • PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記(一) - 抽象類(lèi)、對(duì)象接口、instanceof 和契約式編程
  • PHP面向?qū)ο蟮倪M(jìn)階學(xué)習(xí)(抽像類(lèi)、接口、final、類(lèi)常量)
  • php學(xué)習(xí)筆記 面向?qū)ο笾衃接口]與[多態(tài)性]的應(yīng)用
  • PHP 的ArrayAccess接口 像數(shù)組一樣來(lái)訪問(wèn)你的PHP對(duì)象
  • php面向?qū)ο笕ヂ?(十四) php5接口技術(shù)
  • PHP 對(duì)象接口簡(jiǎn)單實(shí)現(xiàn)方法示例

標(biāo)簽:內(nèi)江 江門(mén) 大同 駐馬店 石嘴山 深圳 雙鴨山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【接口、抽象類(lèi)、靜態(tài)方法等】》,本文關(guān)鍵詞  PHP,學(xué)習(xí),記錄,之,面向,對(duì)象,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【接口、抽象類(lèi)、靜態(tài)方法等】》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【接口、抽象類(lèi)、靜態(tài)方法等】的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 文化| 汽车| 江油市| 壤塘县| 隆回县| 章丘市| 双辽市| 宁南县| 金堂县| 邳州市| 姜堰市| 陇南市| 盐亭县| 余干县| 贞丰县| 肇源县| 宝应县| 蓬莱市| 徐闻县| 襄城县| 武宁县| 保康县| 镶黄旗| 乌兰察布市| 福海县| 昂仁县| 资溪县| 威宁| 金堂县| 泽州县| 宜宾县| 汾阳市| 台州市| 牟定县| 郎溪县| 定安县| 香格里拉县| 博兴县| 北票市| 长治市| 高邑县|