在物件導向的程式設計(英語: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;
?>
執行結果:
宣告類屬性或方法為 static(靜態),就可以不例項化類而直接訪問。concreteclass1
foo_concreteclass1
concreteclass2
foo_concreteclass2
靜態屬性不能通過乙個類已例項化的物件來訪問(但靜態方法可以)。
由於靜態方法不需要通過物件即可呼叫,所以偽變數 $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 ...