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

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

如何在PHP中永久地類型轉換類屬性?

如何在PHP中永久地類型轉換類屬性?

PHP
暮色呼如 2022-08-05 18:46:40
我一直在閱讀PHP手冊的“可見性”部分,在第一條評論中,有人提到:OUTSIDE CODE可以將 Item 屬性轉換為任何其他 PHP 類型(布爾值、整數、浮點數、字符串、數組和對象等)——這是另一個巨大的錯誤。請考慮以下示例:class base {    public $foo = 1;}$first = new base();(string)$first->foo; //I thought just this expression would typecastvar_dump($first->foo); //but I found it still is int$first->foo = (string)$first->foo;    var_dump($first->foo); //ok so public props can be typecasted難道只是對于受保護的私有屬性,我們不能從外部更改它們的類型嗎?或者這是否也適用于公共財產?
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

您正在執行的操作是用新值覆蓋屬性,該值恰好是不同的類型。

類型強制轉換不會影響原始變量或值。它將創建一個類型轉換類型的新值,如果要保留該值,則需要分配該值。

您所要求的內容與對象屬性可見性無關,而是與理解類型轉換是一種不影響其操作數的操作有關。

這對以下方面絕對沒有任何作用:$string

$string = "123";
(int)$string;

...并且類型轉換值丟失,因為我們沒有分配操作的結果

通過以下方法,如果滿足幾個條件,我們可以覆蓋 的值:$class::$someInteger

$class->someInteger = (string) 123;
  1. 該物業是公共的。(您顯然無法從類外部直接訪問或屬性。你可以通過使用反射或奇怪的東西來欺騙這個問題,比如有一個 getter 返回對屬性的引用,但對于生產代碼來說,這兩者都是非常糟糕的主意)。privateprotected

  2. 您沒有使用 PHP 7.4 類型化屬性,并且已為其聲明了類型。

這個問題的“永久”部分特別被誤導,因為在PHP中,變量通常沒有類型。

您可以將任何類型的值賦給任何變量。當它們確實具有類型(PHP 7.4類型化屬性)時,沒有實際的方法可以更改定義的類型(再次,可能有一種方法使用反射...但我不會去那里)。


查看完整回答
反對 回復 2022-08-05
?
白豬掌柜的

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) expressionsqrt((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 


查看完整回答
反對 回復 2022-08-05
?
繁星淼淼

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.47.4

這是在線試用的沙盒鏈接。


查看完整回答
反對 回復 2022-08-05
  • 3 回答
  • 0 關注
  • 188 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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