PHP物件基礎知識
最近開始重新學習物件知識,其實也算是初步深入學習物件和設計模式,希望自己會堅持下去,保持更新
初識PHP物件
還記得,剛開始學習 PHP 的時候,學到到方法和物件時有一個很大的疑問,物件與方法相比較那麼麻煩(需要設定屬性,給屬性賦值,例項化類,呼叫)為什麼還要用物件呢?隨著逐步的深入才發現,自己之前的想法是有多可笑,下面給一個簡單的示例。
function get_max($val_1, $val_2)
{
return $val_1 > $val_2 ? $val_1 : $val_2;
}
$max = get_max(23,34);
echo $max;
echo `<br>======================這是華麗的分隔符======================<br>`;
// 類
class Test
{
// 屬性
public $val_1;
public $val_2;
// 類的方法
public function __construct($val_1, $val_2)
{
$this->val_1 = $val_1;
$this->val_2 = $val_2;
}
public function get_max()
{
return $this->val_1 > $this->val_2 ? $this->val_1 : $this->val_2;
}
}
// 例項化類,$test 是由類 Test 生成的物件
$test = new Test(83, 34);
echo $test->get_max();
可以看到使用物件比單純的方法多了很多程式碼,但是為什麼還要使用物件呢,我們下一節詳細介紹,別走開,往下看
為什麼使用物件
什麼是物件?什麼是類?很多人會把兩個搞混淆,我們可以把類看做一個工廠,產出的產品就是物件,也就是物件是類的實現。
一個類通常包含屬性、方法。舉個:有一個生產麵包的機器(類),生成麵包需要一些材料(屬性),材料包含麵粉、雞蛋、水(不熟悉)。有了材料就可以運作生成麵包了,這時機器會把準備好的材料放一起處理(方法)生成麵包。
關鍵字也是很重要的概念,用來決定宣告的屬性或方法的可見性,包含: public、protected、private。一個屬性或方法設定為 public 就代表無論在物件內還是物件外都可以被使用,比如麵包機裡如果有一個攪拌機(僅限如果),如果這個攪拌機設定為public,則這個攪拌機可以被任何品牌的麵包機使用。如果設定為 protected,則只能在同品牌的麵包機中使用(繼承的類)。如果設定為private則只能被自己用。
回到上節問題,對比方法,問什麼使用物件?因為方便,沒錯真的方便。因為物件有以下幾個特點:
- 封裝性
- 繼承
- 多型
封裝性
封裝:顧名思義,就是把類的屬性和方法封裝起來,設定許可權(public|protected|private),如下:
class Test
{
public $val_1;
protected $val_2;
public function __construct($val_1, $val_2)
{
$this->val_1 = $val_1;
$this->val_2 = $val_2;
}
protected function get_max()
{
return $this->val_1 > $this->val_2 ? $this->val_1 : $this->val_2;
}
}
$test = new Test(83, 34);
echo $test->get_max();
封裝的好處是安全、可控。
以上程式碼因為引用了 protected 宣告的方法,因此會報如下的錯誤
Fatal error: Uncaught Error: Call to protected method StudyDesignModeTest::get_max() from context “ in …
繼承
同樣顧名思義,就是繼承分類的方法或屬性,只能繼承 public | protected 關鍵字宣告的方法或屬性。繼承的主要作用是多個不同的類都需要同樣的一個方法,可以使用繼承。比如多個網站頁面(每個頁面都是單獨的類)都需要驗證是否登入,這時候可以定義一個父類,裡面驗證是否登入,再由需要驗證登入的類繼承,這樣就不需要每個類都寫一次驗證。
class Test
{
private $val_1;
private $val_2;
protected function set_value($val_1, $val_2)
{
$this->val_1 = $val_1;
$this->val_2 = $val_2;
}
protected function getMax()
{
return $this->val_1 > $this->val_2 ? $this->val_1 : $this->val_2;
}
protected function getMin()
{
return $this->val_1 > $this->val_2 ? $this->val_2 : $this->val_1;
}
}
class TestSub extends Test
{
public function __construct($val_1, $val_2)
{
$this->set_value($val_1, $val_2);
}
// 簡單功能測試
public function printMaxValue()
{
echo $this->getMax();
}
public function printMinValue()
{
echo $this->getMin();
}
}
$test = new TestSub(83, 34);
echo `<br>======================這是華麗的分隔符 獲取最大值======================<br>`;
echo $test->printMaxValue();
echo `<br>======================這是華麗的分隔符 獲取最小值======================<br>`;
echo $test->printMinValue();
結果:
======================這是華麗的分隔符 獲取最大值======================
83
======================這是華麗的分隔符 獲取最小值======================
34
多型
就是讓具有繼承關係的不同類物件重寫類中的方法(兩個類中有相同名稱的方法),典型的應用是抽象類(abstract)和介面類(interface)。如下:
abstract class Vehicle
{
abstract public function run();
}
class Car extends Vehicle
{
public function run()
{
echo `速度100`;
}
}
class Bicycle extends Vehicle
{
public function run()
{
echo `速度15`;
}
}
$car = new Car();
echo $car->run();
echo `<br>======================這是華麗的分隔符======================<br>`;
$bicycle = new Bicycle();
echo $bicycle->run();
結果:
速度100
======================這是華麗的分隔符======================
速度15
相關文章
- PHP基礎知識PHP
- PHP 基礎知識-1PHP
- php基礎知識總結PHP
- PHP基礎知識——PHP偽協議PHP協議
- 【轉】JavaScript物件的基礎知識JavaScript物件
- php基礎知識之$GET$POSTPHP
- PHP新手總結的PHP基礎知識PHP
- php基礎知識(五)魔術方法PHP
- Objective-C 基礎一:物件導向過程基礎知識Object物件
- 基礎知識
- 【Java基礎知識】物件導向有哪些特性Java物件
- php物件導向知識點PHP物件
- PHP學習筆記(1)–基礎知識篇PHP筆記
- AI 基礎知識AI
- Webpack 基礎知識Web
- Dart基礎知識Dart
- RabbitMQ基礎知識MQ
- webpack基礎知識Web
- javascript基礎知識JavaScript
- ThinkPHP基礎知識PHP
- Laravel基礎知識Laravel
- Redis基礎知識Redis
- Docker基礎知識Docker
- 程式基礎知識
- Envoy基礎知識
- DockerFile基礎知識Docker
- Nginx基礎知識Nginx
- CSS基礎知識CSS
- Java基礎知識Java
- PRML 基礎知識
- BGP基礎知識
- React基礎知識React
- httpclient基礎知識HTTPclient
- HBase基礎知識
- Jquery基礎知識jQuery
- js基礎知識JS
- PGA基礎知識
- Javascript 基礎知識JavaScript