php學習之五(物件導向)

2021-07-28 05:59:15 字數 3889 閱讀 9906

在物件導向的程式設計(英語:object-oriented programming,縮寫:oop)中,物件是乙個由資訊及對資訊進行處理的描述所組成的整體,是對現實世界的抽象。

}// 變數$this代表自身的物件。

// php_eol為換行符.

類屬性必須定義為公有,受保護,私有之一。如果用 var 定義,則被視為公有。

使用介面(inte***ce),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

介面是通過inte***ce關鍵字來定義的,就像定義乙個標準的類一樣,但其中定義所有的方法都是空的。

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

要實現乙個介面,使用implements操作符。類中必須實現介面中定義的所有方法,否則會報乙個致命錯誤。類可以實現多個介面,用逗號來分隔多個介面的名稱。

<?php 

// 宣告乙個'itemplate'介面

inte***ce itemplate

// 實現介面

class template implements itemplate

public function gethtml($template)

', $value, $template);

}return $template;}}

可以把在類中始終保持不變的值定義為常量。在定義和使用常量的時候不需要使用 $ 符號。

常量的值必須是乙個定值,不能是變數,類屬性,數**算的結果或函式呼叫。

自 php 5.3.0 起,可以用乙個變數來動態呼叫類。但該變數的值不能為關鍵字(如 self,parent 或 static)

<?php 

class myclass

}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

}class concreteclass1 extends abstractclass

public function prefixvalue($prefix) concreteclass1";

}}class concreteclass2 extends abstractclass

public function prefixvalue($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

宣告類屬性或方法為 static(靜態),就可以不例項化類而直接訪問。

靜態屬性不能通過乙個類已例項化的物件來訪問(但靜態方法可以)。

由於靜態方法不需要通過物件即可呼叫,所以偽變數 $this 在靜態方法中不可用。

靜態屬性不可以由物件通過 -> 操作符來訪問。

自 php 5.3.0 起,可以用乙個變數來動態呼叫類。但該變數的值不能為關鍵字 self,parent 或 static。

<?php 

class foo

}print foo::$my_static . php_eol;

$foo = new foo();

print $foo->staticvalue() . php_eol;

?>

php 5 新增了乙個 final 關鍵字。如果父類中的方法被宣告為 final,則子類無法覆蓋該方法。如果乙個類被宣告為 final,則不能被繼承。

以下**執行會報錯:

<?php 

class baseclass

final public function moretesting()

}class childclass extends baseclass

}// 報錯資訊 fatal error: cannot override final method baseclass::moretesting()

?>

php 不會在子類的構造方法中自動的呼叫父類的構造方法。要執行父類的構造方法,需要在子類的構造方法中呼叫parent::__construct()

<?php 

class baseclass

}class subclass extends baseclass

}class othersubclass extends baseclass

// 呼叫 baseclass 構造方法

$obj = new baseclass();

// 呼叫 baseclass、subclass 構造方法

$obj = new subclass();

// 呼叫 baseclass 構造方法

$obj = new othersubclass();

?>

執行結果:
baseclass 類中構造方法

baseclass 類中構造方法

subclass 類中構造方法

baseclass 類中構造方法

php基礎(五)物件導向

面象對向的三大特點 封裝性 繼承性 多型性 首先簡單理解一下抽象 我們在前面定義乙個類的時候,實際上就是把一類事物共有的屬性和行為提取出來,形成乙個物理模型 模版 這種研究問題的方法稱為抽象 一 封裝性 封裝就是把抽取出來的資料和對資料的操作封裝在一起,資料被保護在內部,程式的其他部分只有被授權的操...

五 物件導向(二) 繼承與重寫

1 import 模組名 常規匯入,直接匯入整個包的所有的功能函式。import math import os import sys 以上可簡寫為 import math,os,sys2 from import 語句把乙個模組的所有內容全都匯入到當前的命名空間也是可行的,只需使用如下宣告 from ...

Python學習筆記五 物件導向 類 方法 屬性

這裡所列的都是從c 的角度來看的,可能覺得不是很恰當。但是對於抽象的概念,更方便理解。函式的定義 class python中的類沒有什麼public private protect 建構函式 析構函式 init self del self 類的靜態變數 class student name abc ...