@value 静态变量_你理解 PHP 中的静态方法吗?
它仍然是一個(gè)有爭(zhēng)議的話題。讓我們嘗試了解原因。
函數(shù)中的靜態(tài)變量
您可能已經(jīng)看過(guò)以下代碼:
function testStatic() {static $x = 0;$x++;return $x; }在這里,我們每次調(diào)用 testStatic() 時(shí),關(guān)鍵字 static 允許遞增 $x:
testStatic(); testStatic(); testStatic(); echo testStatic();最后輸出 “4”。與其他局部變量不同,靜態(tài)變量將其值保留在函數(shù)作用域之外。
關(guān)于這點(diǎn)有一些有趣的用法,例如備忘錄。人們使用此技術(shù)存儲(chǔ)復(fù)雜運(yùn)算之后的結(jié)果來(lái)優(yōu)化其腳本。
PHP 類中的靜態(tài)
每次在 PHP 類中使用關(guān)鍵字 static 時(shí),都在設(shè)置與類相關(guān)的內(nèi)容。你無(wú)需實(shí)例化類即可訪問(wèn)它們:
class MyClass {public static $myStaticVar;public static function myStaticFunction() {} }MyClass::myStaticFunction(); MyClass::$myStaticVar;換句話說(shuō),你不會(huì)將變量和函數(shù)綁定到特定對(duì)象示例上。
但是,它與過(guò)程編程有何不同?為什么還要通過(guò)類來(lái)使用呢?
靜態(tài)方法與過(guò)程函數(shù)
你的代碼經(jīng)常需要一些輔助類,大多數(shù)時(shí)候,它們以靜態(tài)調(diào)用的形式存在。
$title = TextUtils::normalizeTitle($title);但是與下面這個(gè)有什么不同呢?
$title = normalizeTitle($title);對(duì)于 PHP 而言,這可能沒(méi)什么不同。靜態(tài)方法相當(dāng)于命名空間函數(shù),僅此而已。
命名空間從 PHP 5.5 開(kāi)始引入。從技術(shù)上講,下面例子中的簡(jiǎn)單的函數(shù)與靜態(tài)方法沒(méi)什么不同。
$title1 = TheNamespaceTextUtils::normalizeTitle($title); $title2 = TheNamespacenormalizeTitle($title);所以如果類中的所有成員都是靜態(tài)的,那么就可以改寫成過(guò)程函數(shù)和命名空間的形式。但是總是如此嗎?
靜態(tài) VS 面向?qū)ο?/h2>
你不需要實(shí)例化類來(lái)訪問(wèn)其靜態(tài)方法。因此,你的類的所有實(shí)例都共享相同的靜態(tài)方法。
在 PHP 類中,你可通過(guò) $this 來(lái)獲取當(dāng)前實(shí)例,而靜態(tài)方法無(wú)法訪問(wèn)它。
來(lái)看看下面這個(gè)例子
<?php class Order {public $price;public function __construct($price) {$this->price = self::formatPrice($price);}protected static function formatPrice($price) { return round($price, 3);} }$order = new Order('73.1111'); echo $order->price;formatPrice() 不需要使用 $this,因?yàn)樵摲椒ú](méi)有涉及到實(shí)例的變更。它是靜態(tài)的,所有的實(shí)例共享該方法。
利弊
許多開(kāi)發(fā)更喜歡用非靜態(tài)方法而不是靜態(tài)方法。一些人認(rèn)為靜態(tài)方法會(huì)破壞類的封裝性,另外一些則說(shuō)靜態(tài)方法會(huì)導(dǎo)致代碼異味。
不要誤解我,這些確實(shí)是事實(shí)。我的意思是對(duì)于該話題的討論存在一些迷思,例如:
靜態(tài)代碼不安全。相反,在應(yīng)用中設(shè)置非可變?cè)厮坪醺踩?/p>
如果你有大量的數(shù)據(jù),使用靜態(tài)可能不是一個(gè)好主意。如果你需要狀態(tài)機(jī)制,也就是說(shuō),需要使用邏輯隔離的實(shí)例,這似乎也不是一個(gè)好主意。
總結(jié)
靜態(tài)可能不錯(cuò),但可能被誤用了。只是在同等條件下,你不能將其應(yīng)用于任何事情。
我喜歡 OOP,這是一個(gè)很棒的范例,但是我想知道是否所有的東西都需要一個(gè)對(duì)象。我想不是,我有想聽(tīng)聽(tīng)你的意見(jiàn)。
更多學(xué)習(xí)內(nèi)容請(qǐng)?jiān)L問(wèn):
八重櫻:騰訊T3-T4標(biāo)準(zhǔn)精品PHP架構(gòu)師教程目錄大全,只要你看完保證薪資上升一個(gè)臺(tái)階(持續(xù)更新)?zhuanlan.zhihu.com以上內(nèi)容希望幫助到大家,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問(wèn)題和瓶頸,業(yè)務(wù)代碼寫多了沒(méi)有方向感,不知道該從那里入手去提升,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家,需要的可以加入我的官方群點(diǎn)擊此處。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的@value 静态变量_你理解 PHP 中的静态方法吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .dat数据文件怎么打开_U盘坏了怎么恢
- 下一篇: 开机后台运行jupyter_手机重启=关