好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > PHP學習記錄之面向對象(Object-oriented programming,OOP)基礎【接口、抽象類、靜態方法等】

PHP學習記錄之面向對象(Object-oriented programming,OOP)基礎【接口、抽象類、靜態方法等】

熱門標簽:電銷機器人沒有效果怎么樣 天潤融通外呼系統好嗎 泊頭在哪里辦理400電話 江門回撥外呼系統 欣思維地圖標注 高德地圖標注店鋪收費嗎 杭州語音電銷機器人 高德地圖標注位置怎么標注 江西電銷機器人收費

本文實例講述了PHP面向對象(Object-oriented programming,OOP)基礎。分享給大家供大家參考,具體如下:

我們可以使用接口(interface),指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容,我們可以通過 interface 關鍵字來定義,就像定義一個標準的類一樣,但其中定義所有的方法都是空的,但是其中定義的所有方法都必須是公有,這是接口的特性。

但是我們如果要實現一個接口,就得使用 implements 操作符,并且類中必須實現接口中定義的所有方法,否則會報一個致命錯誤,其中類還可以實現多個接口,用逗號來分隔多個接口的名稱,是不是很神奇???來看實例感受下:

?php
// 聲明一個'iTemplate'接口
interface iTemplate
{
  public function setVariable($name, $var);
  public function getHtml($template);
}
// 實現接口
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;
  }
}

我們可以把在類中始終保持不變的值定義為常量,但是在定義和使用常量的時候不需要使用 $ 符號。需要注意的就是,常量的值必須是一個定值,不能是變量,類屬性,數學運算的結果或函數調用。自 PHP 5.3.0 起,我們可以用一個變量來動態調用類,但該變量的值不能為關鍵字(如 self,parent 或 static),來看實例感受下:

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

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

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

?php
abstract class AbstractClass
{
 // 強制要求子類定義這些方法
  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;
?>

輸出結果為:

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

我們還要記得,子類方法可以包含父類抽象方法中不存在的可選參數,舉個栗子,例如,子類定義了一個可選參數,而父類抽象方法的聲明里沒有,則也是可以正常運行的,如下:

?php
abstract class AbstractClass
{
  // 我們的抽象方法僅需要定義需要的參數
  abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
  // 我們的子類可以定義父類簽名中不存在的可選參數
  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";
?>

輸出結果為:

Mr. Pacman
Mrs. Pacwoman

聲明類屬性或方法為 static(靜態),它可以不實例化類而直接訪問,但是,靜態屬性不能通過一個類已實例化的對象來訪問(但靜態方法可以)。另外,由于靜態方法不需要通過對象即可調用,所以偽變量 $this 在靜態方法中不可用,也就是說,靜態屬性不可以由對象通過 -> 操作符來訪問。自 PHP 5.3.0 起,我們可以用一個變量來動態調用類,但該變量的值不能為關鍵字 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;
?>

輸出結果如下:

foo
foo

PHP 5 新增了一個 final 關鍵字,它的作用就是,如果父類中的方法被聲明為 final,則子類無法覆蓋該方法,如果一個類被聲明為 final,則不能被繼承,如下案例,會報錯的哦:

?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;
  }
}
// 報錯信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>

PHP 不會在子類的構造方法中自動的調用父類的構造方法,如果需要執行父類的構造方法,我們可以在子類的構造方法中調用 parent::__construct(),如下:

?php
class BaseClass {
  function __construct() {
    print "BaseClass 類中構造方法" . PHP_EOL;
  }
}
class SubClass extends BaseClass {
  function __construct() {
    parent::__construct(); // 子類構造方法不能自動調用父類的構造方法
    print "SubClass 類中構造方法" . PHP_EOL;
  }
}
class OtherSubClass extends BaseClass {
  // 繼承 BaseClass 的構造方法
}
// 調用 BaseClass 構造方法
$obj = new BaseClass();
// 調用 BaseClass、SubClass 構造方法
$obj = new SubClass();
// 調用 BaseClass 構造方法
$obj = new OtherSubClass();
?>

輸出結果為:

BaseClass 類中構造方法
BaseClass 類中構造方法
SubClass 類中構造方法
BaseClass 類中構造方法

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

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP面向對象程序設計之接口的繼承定義與用法詳解
  • PHP面向對象五大原則之接口隔離原則(ISP)詳解
  • PHP面向對象程序設計高級特性詳解(接口,繼承,抽象類,析構,克隆等)
  • PHP入門教程之面向對象的特性分析(繼承,多態,接口,抽象類,抽象方法等)
  • PHP面向對象程序設計之接口用法
  • PHP 面向對象程序設計(oop)學習筆記(一) - 抽象類、對象接口、instanceof 和契約式編程
  • PHP面向對象的進階學習(抽像類、接口、final、類常量)
  • php學習筆記 面向對象中[接口]與[多態性]的應用
  • PHP 的ArrayAccess接口 像數組一樣來訪問你的PHP對象
  • php面向對象全攻略 (十四) php5接口技術
  • PHP 對象接口簡單實現方法示例

標簽:內江 江門 平涼 大同 駐馬店 石嘴山 深圳 雙鴨山

巨人網絡通訊聲明:本文標題《PHP學習記錄之面向對象(Object-oriented programming,OOP)基礎【接口、抽象類、靜態方法等】》,本文關鍵詞  PHP,學習,記錄,之,面向,對象,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP學習記錄之面向對象(Object-oriented programming,OOP)基礎【接口、抽象類、靜態方法等】》相關的同類信息!
  • 本頁收集關于PHP學習記錄之面向對象(Object-oriented programming,OOP)基礎【接口、抽象類、靜態方法等】的相關信息資訊供網民參考!
  • 推薦文章