亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP 中 @property 注釋和受保護變量有什么區別?

PHP 中 @property 注釋和受保護變量有什么區別?

PHP
慕沐林林 2023-11-04 20:55:52
我有一個問題。在 PHP 類開發過程中,我在構造函數中設置了一個類屬性,如下所示:public function __construct() {    $this->a = 'ABC';}現在我的 IDE 告訴我該屬性是動態聲明的,我應該將此屬性添加到我的類中。現在我有兩個選擇:類頂部的變量:protected string  $a = '';或者類文檔中的注釋:/** * Class ABC * * @property string a *  * @package Johnny */class ABC {那么這里有什么區別以及我應該使用哪一個呢?有時我在使用上面的注釋時會遇到錯誤,property is not defined因此修復是受保護的或私有的變量。
查看完整描述

2 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

受保護的屬性只能從同一類或子類中的方法訪問。聲明該屬性protected可防止在類外部對其進行賦值或讀取。

在文檔塊中添加@property注釋只是讓 IDE 知道該屬性存在。它將使用它來抑制像您收到的警告一樣的警告,并完成屬性名稱補全,就像它對在類定義中顯式聲明的屬性所做的那樣。它對 PHP 本身處理屬性的方式影響不大;訪問控制由屬性是否聲明為公共、私有或受保護來指定。

您還可以在類定義中創建公共和私有屬性。

public?string?$a;
private?string?$a;

Public 意味著該屬性可以從類外部訪問(就像動態創建的屬性一樣),private 意味著它只能從類本身(而不是子類)訪問。

如果您沒有顯式聲明屬性,并使用賦值動態創建它,則它會自動成為公共屬性。


查看完整回答
反對 回復 2023-11-04
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

這是屬性類型的顯式聲明:


protected string  $a = '';

這是內部強制的限制。如果您嘗試將字符串以外的其他內容分配給$a,您將收到 TypeError 異常。像這樣聲明屬性類型提示是 7.4 中引入的功能。如果您知道您的環境將是 7.4+,您應該更喜歡此方法。


這是一個文檔塊:


/**

 * @var string

 */

public $a;

這是一條對腳本運行時沒有影響的注釋。它的存在只是為了讓 PHPStorm 或 NetBeans 等 IDE 可以在您的開發環境中提供提示。如果您使用像上面這樣的顯式類型提示,那么這些文檔塊聲明是多余且不需要的。即,沒有必要這樣做:


/**

 * @var string

 */

public string $a;

請注意,有相當多的庫使用注釋文檔塊來提供特殊的運行時含義。這些庫使用反射來動態解析文檔塊注釋并對它們做出反應。換句話說,PHP 本身不受文檔塊注釋的影響,但您的腳本能夠查看它們,因此能夠根據它們確定條件。例如,使用 Doctrine,您可以使用文檔塊注釋來解釋數據庫字段的樣子:


/**

 * @ORM/Column(type="int")

 * @ORM/Id

 */

protected $id;


查看完整回答
反對 回復 2023-11-04
  • 2 回答
  • 0 關注
  • 333 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號