3 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
您正在執(zhí)行的操作是用新值覆蓋屬性,該值恰好是不同的類(lèi)型。
類(lèi)型強(qiáng)制轉(zhuǎn)換不會(huì)影響原始變量或值。它將創(chuàng)建一個(gè)類(lèi)型轉(zhuǎn)換類(lèi)型的新值,如果要保留該值,則需要分配該值。
您所要求的內(nèi)容與對(duì)象屬性可見(jiàn)性無(wú)關(guān),而是與理解類(lèi)型轉(zhuǎn)換是一種不影響其操作數(shù)的操作有關(guān)。
這對(duì)以下方面絕對(duì)沒(méi)有任何作用:$string
$string = "123"; (int)$string;
...并且類(lèi)型轉(zhuǎn)換值丟失,因?yàn)槲覀儧](méi)有分配操作的結(jié)果
通過(guò)以下方法,如果滿足幾個(gè)條件,我們可以覆蓋 的值:$class::$someInteger
$class->someInteger = (string) 123;
該物業(yè)是公共的。(您顯然無(wú)法從類(lèi)外部直接訪問(wèn)或?qū)傩浴D憧梢酝ㄟ^(guò)使用反射或奇怪的東西來(lái)欺騙這個(gè)問(wèn)題,比如有一個(gè) getter 返回對(duì)屬性的引用,但對(duì)于生產(chǎn)代碼來(lái)說(shuō),這兩者都是非常糟糕的主意)。
private
protected
您沒(méi)有使用 PHP 7.4 類(lèi)型化屬性,并且已為其聲明了類(lèi)型。
這個(gè)問(wèn)題的“永久”部分特別被誤導(dǎo),因?yàn)樵赑HP中,變量通常沒(méi)有類(lèi)型。
您可以將任何類(lèi)型的值賦給任何變量。當(dāng)它們確實(shí)具有類(lèi)型(PHP 7.4類(lèi)型化屬性)時(shí),沒(méi)有實(shí)際的方法可以更改定義的類(lèi)型(再次,可能有一種方法使用反射...但我不會(huì)去那里)。

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
你的問(wèn)題是基于對(duì)術(shù)語(yǔ)類(lèi)型轉(zhuǎn)換含義的誤解。PHP手冊(cè)中關(guān)于類(lèi)型轉(zhuǎn)換的頁(yè)面和整個(gè)手冊(cè)是不夠的,也不是學(xué)習(xí)php語(yǔ)言的獨(dú)立規(guī)范參考。另外,它假設(shè)您了解其他編程語(yǔ)言,例如C。
類(lèi)型轉(zhuǎn)換不定義為變量的數(shù)據(jù)類(lèi)型轉(zhuǎn)換;它是表達(dá)式的數(shù)據(jù)類(lèi)型轉(zhuǎn)換 - 通常,這是在大多數(shù)編程語(yǔ)言中。Wikipedea將其定義如下:
在計(jì)算機(jī)科學(xué)中,類(lèi)型轉(zhuǎn)換、類(lèi)型強(qiáng)制轉(zhuǎn)換、類(lèi)型強(qiáng)制和類(lèi)型雜耍是將表達(dá)式從一種數(shù)據(jù)類(lèi)型更改為另一種數(shù)據(jù)類(lèi)型的不同方法。
官方手冊(cè)使用三個(gè)術(shù)語(yǔ),即類(lèi)型雜耍,類(lèi)型轉(zhuǎn)換和類(lèi)型轉(zhuǎn)換。從第一段中可以猜到,類(lèi)型雜耍和類(lèi)型轉(zhuǎn)換是一回事。在第一段中,他們說(shuō):
請(qǐng)注意,這不會(huì)更改操作數(shù)本身的類(lèi)型;唯一的變化是操作數(shù)的計(jì)算方式...
應(yīng)該清楚的是,類(lèi)型雜耍絕對(duì)不會(huì)改變變量的類(lèi)型。從php手冊(cè)中可以看出,類(lèi)型雜耍和類(lèi)型轉(zhuǎn)換是兩個(gè)不同的概念。問(wèn)題是,由于PHP手冊(cè)從未定義過(guò)這些術(shù)語(yǔ),我們?nèi)绾未_保這兩個(gè)術(shù)語(yǔ)是否相同以及它們的實(shí)際含義。在類(lèi)型鑄造文章中,手冊(cè)說(shuō):
PHP中的類(lèi)型轉(zhuǎn)換的工作方式與在C:...
所以,答案是,我們可以安全地假設(shè)C語(yǔ)言的類(lèi)型轉(zhuǎn)換的定義適用于PHP語(yǔ)言。在C語(yǔ)言中,類(lèi)型轉(zhuǎn)換的定義與維基百科定義相同,即僅轉(zhuǎn)換表達(dá)式的數(shù)據(jù)類(lèi)型。以下摘錄摘自K&R的《The C Programming Language by K&R》一書(shū),第2版,第2.7節(jié),第45頁(yè):
在構(gòu)造中,表達(dá)式被轉(zhuǎn)換為命名類(lèi)型... ...cast的確切含義是,就好像表達(dá)式被分配給特定類(lèi)型的變量一樣......我們可以使用...請(qǐng)注意,強(qiáng)制轉(zhuǎn)換在正確的類(lèi)型中產(chǎn)生n的值,n本身不會(huì)改變。
(type-name) expression
sqrt((double) n)
這樣的結(jié)論是,php 中的類(lèi)型轉(zhuǎn)換的工作方式與類(lèi)型雜耍相同,因?yàn)樗僮鞯淖兞浚ú僮鲾?shù))的數(shù)據(jù)類(lèi)型不會(huì)更改。您可以使用該函數(shù)來(lái)轉(zhuǎn)換變量的數(shù)據(jù)類(lèi)型。settype()
正如第一段所指出的,php手冊(cè)的type頁(yè)面在最后一段中給出了以下技術(shù)上錯(cuò)誤的注釋?zhuān)?/p>
要強(qiáng)制將變量轉(zhuǎn)換為特定類(lèi)型,請(qǐng)強(qiáng)制轉(zhuǎn)換該變量或?qū)ζ涫褂?settype() 函數(shù)。
現(xiàn)在,您知道php中的類(lèi)型轉(zhuǎn)換實(shí)際上意味著什么,以及為什么您有這種誤解,最好將您的問(wèn)題改寫(xiě)如下:
改寫(xiě)的問(wèn)題:如何在 PHP 中永久轉(zhuǎn)換類(lèi)屬性的數(shù)據(jù)類(lèi)型。
很明顯,公共屬性將很容易地通過(guò) 轉(zhuǎn)換為不同類(lèi)型的。有趣的是,與用戶yivi的原始答案中提出的建議相反,可以評(píng)估私有
和受保護(hù)的
屬性,并且可以從類(lèi)外轉(zhuǎn)換其類(lèi)型[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貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
類(lèi)型轉(zhuǎn)換類(lèi)屬性現(xiàn)在在 中可用。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
致命錯(cuò)誤: 未捕獲的類(lèi)型錯(cuò)誤: 鍵入的屬性 用戶::$id 必須是 int, 字符串用于 [...][...]:7 堆棧跟蹤: #0 {main} 拋入 [...][...]在7號(hào)線
您需要切換到 .此功能現(xiàn)已在其官方文檔的鏈接中提供php7.4
7.4
這是在線試用的沙盒鏈接。
- 3 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報(bào)