本節講解的內容
#靜態屬性和靜態方法
訪問修飾符
單例模式
魔術方法
-
類別的自動載入
前言
在上一節中,我們介紹了物件導向的基本使用,但是上節的知識,在實際中還有問題是解決不了的,例如我們去買票,有一個總票數(定義票這個屬性),來一個人買一張票(票-1),但是我們每次創建一個對象,根據對象在記憶體中的方式,都是重新創建一個總票數,這樣是不合理,這裡我們就使用到了靜態這個概念,在PHP中類別中的靜態分為兩種:
靜態屬性
靜態方法
#靜態屬性
靜態屬性是該類別的所有物件共享的變數,任何一個該類別的物件去存取它時,取到的都是相同的值,同樣任何一個該類別的物件去修改它時,修改的也是同一個變數
<?php class Ticket{ public static $number = 100; //设置总的票数是100; public $name ; public function __construct($name){ $this-> name = $name; } //定义一个方法进行买票 public function sellTicket(){ echo $this-> name . '买票了<br>'; self::$number--; //每调用一次方法总票数就减一。 } } $people1 = new Ticket('小白'); $people2 = new Ticket('小明'); $people3 = new Ticket('小华'); $people4 = new Ticket('小张'); //每个人进行买票 $people1 -> sellTicket(); $people2 -> sellTicket(); $people3 -> sellTicket(); $people4 -> sellTicket(); echo Ticket::$number; //在类的外部通过类名访问静态属性。 ......结果........ 小白买票了 小明买票了 小华买票了 小张买票了 96
在上面的程式碼中可以看到靜態屬性的定義方式。
访问修饰符 static $静态属性名字 = 初始化值;
靜態屬性只能定義在類別的內部。
靜態屬性的存取
在類別外面
在類別外面我們也是可以存取類別中的靜態屬性的,就像上面寫的那樣透過類別名稱來直接存取(只有權限修飾符是public的時候才能這樣)Ticket::$number;其中::是範圍解析符。
在類別的外部也可以透過物件來對靜態屬性進行存取
$people4::$number;
透過類別名稱進行存取是透過範圍解析符::進行存取。
在類別裡面
上面的程式碼中,我們可以看到,在類別中我們透過self::$靜態屬性名進行存取。除了這種方式,在類別中還有一種方式來進行存取。
Ticket::$number--;
透過類別名稱來存取。而推薦使用的格式是透過self這種方式,因為這種方式當我們的類別名稱改變後,也不用修改。那麼self和$this有什麼差別呢?
$this和self的區別
其實在上節講到$this,是指向當前的物件的,而這裡的self是指向目前類別,一個指向對象,一個指向類,指向不同。同時他們兩個的使用方式不一樣self是兩個::,$this是->。但是它們兩個的適用範圍是一樣的,都是在類別的內部使用。
靜態屬性的使用
在上面我們只是講解了靜態屬性的定義方法以及使用方法,至於什麼時候需要使用到靜態屬性。當我們在專案開發中,需要讓所有的物件共享一份資料時,我們就考慮使用靜態屬性。
靜態屬性也是一個屬性,那麼它與普通屬性的差別是:
#屬性加上static這個關鍵字,就會變成靜態屬性。
靜態屬性的屬於類別的,所有物件共享的屬性
#普通屬性是屬於單一物件的。
注意,就像上面的一樣,在非靜態方法中可以存取靜態屬性。 ;
靜態方法
上面講到靜態屬性,那麼接下來就講一講靜態方法。
<?php class Ticket{ public static $number = 100; //设置总的票数是100; public $name ; public function __construct($name){ $this-> name = $name; } public static function sayHello(){ echo '这是静态方法<br>'; } public function info(){ //在类的内部使用静态方法 self::sayHello(); //通过self访问 Ticket::sayHello();//通过类名的方式进行访问 } } $people1 = new Ticket('小白'); $people1 -> info(); $people1::sayHello(); //在类的外部通过对象名进行访问 Ticket::sayHello(); //通过类型进行访问。 ......结果........ 这是静态方法 这是静态方法 这是静态方法 这是静态方法
靜態方法的定義方式是透過關鍵字static來定義的:
访问修饰符 static function 方法名(参数列表){ code.... }
靜態方法的存取權
##在類別外面
靜態方法在類別外邊的存取形式和存取靜態屬性的方法是一樣的(權限修飾符只有是public才可以在外部存取)。- 透過類別名稱::靜態方法名稱進行存取
- #透過物件名稱::靜態方法名稱(不推薦)
- 透過物件名稱->靜態方法名。也就是訪問方法的形式。
在類別裡面
在類別裡面存取靜態方法的方式和存取靜態屬性的方法也是一樣的- #self::靜態方法名稱
- 類別名稱::靜態方法名稱
靜態方法的使用
那麼我們在什麼情況下使用靜態方法呢?我們可以在操作靜態屬性的時候使用靜態方法。- 當我們需要操作靜態屬性時,我們考慮使用
- #在我們php開發中,常常會使用到一些模式,例如單範例模式,工廠模式,觀察者模式等,都使用使用靜態方法.
#注意:靜態方法不能存取非靜態屬性;
############################################# ####存取修飾符#########在上面的程式碼中和說明中,我們可以看到不管是在屬性的前面還是在方法的前面都有一個public,這個public就是存取修飾符其中的一種。存取修飾符可以說是實作物件封裝的方法。 ###
访问修饰符的分类及区别
在PHP中访问修饰符可以分为三中
public 在上面的代码中我们都是使用的public,使用这种这个关键字修饰的属性和方法,不管在类的内部还是在类的内部都是可以访问的。
-
protected(受保护的)如果使用这个关键字修饰,那么在类的外部是不能访问。只能在类的内部进行访问。
<?php class Cat{ public $name; protected $age; public function __construct($name,$age){ $this -> name = $name; $this -> age = $age; } } $cat = new Cat('小白',4); echo $cat -> name; //在类的外部访问public echo '<br>'; echo $cat -> age; //在类的外部访问protected修饰的属性。 ......结果..... 小白 Fatal error: Cannot access protected property Cat::$age in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\xiushifu.php on line 16
错误的信息是说不能访问protected修饰的属性。
private(私有的),只能在类的内部使用,在外部使用会报和上面一样的错误。
这三种,后面两种看起来作用一样,都是只能在类内部使用,那又有什么区别呢?现在看来,并没有区别,但是学过类的继承,那么这两种还是有区别的。
访问修饰符的使用:
成员属性必须制定访问修饰符,不然会报错
方法前面可以不写修饰符,默认是public
静态属性可以不指定访问修饰符,默认是public
单例模式
上面讲解到我们什么时候使用到静态方法。在一些设计模式中,我们可以使用到静态方法和静态属性。
设计模式:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。(百度)
在开发的时候,我们有这样的需求,在代码中我们创建一个对象,但是我们希望在一个项目中,这个对象实例只能有一个,不能创建多个对象,从而实现对数据库等资源的保护。这时候就使用到单例模式。
<?php class DaoMysql{ public $link; //模拟数据库连接 private static $instance;//当前类的对象。 private function __construct(){ echo '数据库连接<br>'; } public static function getInstance(){ if(self::$instance == null){ self::$instance = new DaoMysql(); } return self::$instance; } public function insertSql(){ echo '添加数据<br>'; } } $daoMysql = DaoMysql::getInstance(); $daoMysql -> insertSql(); $daoMysql2 = DaoMysql::getInstance(); $daoMysql2 -> insertSql(); ......结果....... 数据库连接 添加数据 添加数据
1. 既然是单例模式,那么就不能在外部创建对象,这就要把构造函数用private修饰(创建对象要调用构造函数,这里把构造函数私有化,调用不起来),这样在外部就不能创建对象。
2. 我们在类里面创建了一个对象的引用$instance,在类里面创建对象,这是允许的。
3. 在类中定义一个静态方法,我们就是通过这个方法来创建对象,通过类名::方法名进行创建,进去后先判断$instance是否为空,只有如空的时候我们才进行创建。然后返回对象。
4. 因为要在静态方法中访问属性,那么这个属性就应该是静态的属性。
5. 在类的外部通过类::静态方法名进行对象的创建。
6. 在结果中我们可以看到我们有两个对象,但是构造方法在第二次没有执行,说明对象没有创建。
虽然在上面我们做了很多限制,但是在PHP中还是有方法的到更过的对象,克隆和继承。
对象类型运算符
在上面的静态方法中判断对象是否创建还有一种方法。
if(!(self::$instance instanceof self)){ self::$instance = new DaoMysql(); }
其中instanceof就是类型运算符。 根据帮助文档,它有几个作用
用于确定一个 PHP 变量是否属于某一类 class 的实例:
可用来确定一个变量是不是继承自某一父类的子类的实例:
也可用于确定一个变量是不是实现了某个接口的对象的实例:
上面的代码中self代表当前的类。instanceof判断前面的变量是否是后面类的实例,然后取反。
魔术方法
在PHP中有一些定义在类中的神奇的方法,称为魔术方法。具体的魔术的方法的使用可以看另外一篇博客
PHP的魔术方法
类的自动加载
在前面我们讲过文件的引入,使用include和require这两种类型。在开发中我们有时需要引入大量的文件,可以是10个,也可能是20个,如果还是使用原来的方法,累人。
在 PHP 5 中,不再需要这样了。可以定义一个 __autoload() 函数,它会在试图使用尚未被定义的类时自动调用。
而我们在写类的时候,一般都是一个类一个文件,而文件的名字我们一般是类名.class.php的格式。
<?php //自动加载的方法,当我们使用这个文件不存在的类的时候,就会自动加载。 function __autoload($class_name){ require_once './' . $class_name . '.class.php'; } $dao = new Dao('小白',5); $cat = new Cat('小花',2); $dao -> eat(); $cat -> eat();
__autoload($类名),在个函数不是写在类中的,所以前面是没有权限修饰符。
上面的自动加载方式是有局限性的,当文件是在不同的文件夹中的时候,这种方法显然是不行的。这时候可以创建一个数组,把类名当做键,对应的路径当成值,进行存储。自动加载的时候就能正确的引入。
<?php $path = array( 'Dao' => './dao/Dao.class.php', 'Cat' => './cat/Cat.class.php' ); //自动加载的方法,当我们使用这个文件不存在的类的时候,就会自动加载。 function __autoload($class_name){ global $path; require_once $path[$class_name]; } $dao = new Dao('小白',5); $cat = new Cat('小花',2); $dao -> eat(); $cat -> eat();
可以看到在前面定义了一个数组用来存储路径。
注意:在函数中使用global声明一下,才能使用全局变量。
总结
在面向对象中用到静态属性和静态方法的时候还是很多的。同时权限修饰符在面向对象中是很重要的,因为我们通过修饰符控制访问权限。魔术方法的掌握,也可以让我们在访问中明白各种调理机制。
以上就是PHP基础教程十之静态属性和静态方法的内容,更多相关内容请关注PHP中文网(www.php.cn)!

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。