3 回答

TA貢獻1936條經驗 獲得超7個贊
您正在執行的操作是用新值覆蓋屬性,該值恰好是不同的類型。
類型強制轉換不會影響原始變量或值。它將創建一個類型轉換類型的新值,如果要保留該值,則需要分配該值。
您所要求的內容與對象屬性可見性無關,而是與理解類型轉換是一種不影響其操作數的操作有關。
這對以下方面絕對沒有任何作用:$string
$string = "123"; (int)$string;
...并且類型轉換值丟失,因為我們沒有分配操作的結果
通過以下方法,如果滿足幾個條件,我們可以覆蓋 的值:$class::$someInteger
$class->someInteger = (string) 123;
該物業是公共的。(您顯然無法從類外部直接訪問或屬性。你可以通過使用反射或奇怪的東西來欺騙這個問題,比如有一個 getter 返回對屬性的引用,但對于生產代碼來說,這兩者都是非常糟糕的主意)。
private
protected
您沒有使用 PHP 7.4 類型化屬性,并且已為其聲明了類型。
這個問題的“永久”部分特別被誤導,因為在PHP中,變量通常沒有類型。
您可以將任何類型的值賦給任何變量。當它們確實具有類型(PHP 7.4類型化屬性)時,沒有實際的方法可以更改定義的類型(再次,可能有一種方法使用反射...但我不會去那里)。

TA貢獻1893條經驗 獲得超10個贊
你的問題是基于對術語類型轉換含義的誤解。PHP手冊中關于類型轉換的頁面和整個手冊是不夠的,也不是學習php語言的獨立規范參考。另外,它假設您了解其他編程語言,例如C。
類型轉換不定義為變量的數據類型轉換;它是表達式的數據類型轉換 - 通常,這是在大多數編程語言中。Wikipedea將其定義如下:
在計算機科學中,類型轉換、類型強制轉換、類型強制和類型雜耍是將表達式從一種數據類型更改為另一種數據類型的不同方法。
官方手冊使用三個術語,即類型雜耍,類型轉換和類型轉換。從第一段中可以猜到,類型雜耍和類型轉換是一回事。在第一段中,他們說:
請注意,這不會更改操作數本身的類型;唯一的變化是操作數的計算方式...
應該清楚的是,類型雜耍絕對不會改變變量的類型。從php手冊中可以看出,類型雜耍和類型轉換是兩個不同的概念。問題是,由于PHP手冊從未定義過這些術語,我們如何確保這兩個術語是否相同以及它們的實際含義。在類型鑄造文章中,手冊說:
PHP中的類型轉換的工作方式與在C:...
所以,答案是,我們可以安全地假設C語言的類型轉換的定義適用于PHP語言。在C語言中,類型轉換的定義與維基百科定義相同,即僅轉換表達式的數據類型。以下摘錄摘自K&R的《The C Programming Language by K&R》一書,第2版,第2.7節,第45頁:
在構造中,表達式被轉換為命名類型... ...cast的確切含義是,就好像表達式被分配給特定類型的變量一樣......我們可以使用...請注意,強制轉換在正確的類型中產生n的值,n本身不會改變。
(type-name) expression
sqrt((double) n)
這樣的結論是,php 中的類型轉換的工作方式與類型雜耍相同,因為所操作的變量(操作數)的數據類型不會更改。您可以使用該函數來轉換變量的數據類型。settype()
正如第一段所指出的,php手冊的type頁面在最后一段中給出了以下技術上錯誤的注釋:
要強制將變量轉換為特定類型,請強制轉換該變量或對其使用 settype() 函數。
現在,您知道php中的類型轉換實際上意味著什么,以及為什么您有這種誤解,最好將您的問題改寫如下:
改寫的問題:如何在 PHP 中永久轉換類屬性的數據類型。
很明顯,公共屬性將很容易地通過 轉換為不同類型的。有趣的是,與用戶yivi的原始答案中提出的建議相反,可以評估私有
和受保護的
屬性,并且可以從類外轉換其類型[1][2]。settype($myObj->myPubProp, required-type)
方法 1:使用引用:
class myClass {
private $prop = 786; //Could be protected too.
public function &assess_priv(){
return $this->prop;
}
public function display_prop() {
echo var_dump($this->prop);
}
}
$obj = new myClass;
$newObjProp = &$obj->assess_priv();
settype($newObjProp, "string");
$obj->display_prop(); //converted the data type of private property of a class
方法 2: 使用 PHP 屬性重載
error_reporting(E_ALL);
class myClass {
private $prop = 786; //Could be protected too.
public function __set($name, $value)
{
$this->$name = $value;
}
public function __get($name)
{
return $this->$name;
}
}
$obj = new myClass;
var_dump($obj->prop);
$obj->prop = (string)$obj->prop; //Interestingly, settype($obj->prop, "string"); can't be used
echo "</br>";
var_dump($obj->prop); //converted the data type of private property of a class

TA貢獻1775條經驗 獲得超11個贊
類型轉換類屬性現在在 中可用。php7.4
<?php
class User {
public int $id;
public string $name;
}
$user = new User;
$user->id = 123; // this will work
$user->id = "hello world"; // throws fatal error
致命錯誤: 未捕獲的類型錯誤: 鍵入的屬性 用戶::$id 必須是 int, 字符串用于 [...][...]:7 堆棧跟蹤: #0 {main} 拋入 [...][...]在7號線
您需要切換到 .此功能現已在其官方文檔的鏈接中提供php7.4
7.4
這是在線試用的沙盒鏈接。
- 3 回答
- 0 關注
- 188 瀏覽
添加回答
舉報