第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 PHP 7.4 中獲取類型化屬性的類型

在 PHP 7.4 中獲取類型化屬性的類型

PHP
繁花不似錦 2022-06-11 09:32:19
我有一個(gè)DTO帶類型的 PHP 變量:class CreateMembershipInputDto extends BaseDto{    public bool $is_gift;    public int $year;    public string $name;    public \DateTime $shipping_date;    public ContactInputDto $buyer;    public ?ContactInputDto $receiver;}我正在嘗試制作某種自動(dòng)映射器來填充屬性,但是我需要檢查變量的類型,但這似乎是不可能的。class BaseDto{    public function __construct($json)    {        $jsonArray = json_decode($json, true);        foreach($jsonArray as $key=>$value){            $type = gettype($this->$key);            if($type instanceof BaseDto)                $this->$key = new $type($value);            else                $this->$key = $value;        }    }}ContactInputDto:class ContactInputDto extends BaseDto{    public string $firstname;    public string $lastname;    public string $street_housenumber;    public string $postal_code;    public string $place;    public string $country;    public string $email;    public string $phone;}是否有可能使該行"gettype($this->$key)"工作,而不會引發(fā)以下錯(cuò)誤:類型化屬性 App\Dto\CreateMembershipInputDto::$is_gift 在初始化之前不得訪問
查看完整描述

1 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

雖然該手冊目前似乎沒有記錄它,但添加了一種方法ReflectionProperty來允許您獲取類型。這實(shí)際上是在RFC 中為類型化屬性指定的


以下是您將如何使用它:


class CreateMembershipInputDto extends BaseDto {

    public bool $is_gift;

    public int $year;

    public string $name;

    public \DateTime $shipping_date;

    public ContactInputDto $buyer;

    public ?ContactInputDto $receiver;

}


class BaseDto

{

    public function __construct($json)

    {   

        $r = new \ReflectionClass(static::class); //Static should resolve the the actual class being constructed

        $jsonArray = json_decode($json, true);

        foreach($jsonArray as $key=>$value){

            $prop = $r->getProperty($key);

            if (!$prop || !$prop->getType()) { continue; } // Not a valid property or property has no type   

            $type = $prop->getType();

            if($type->getName() === BaseDto::class) //types names are strings

                $this->$key = new $type($value);

            else

                $this->$key = $value;

        }

    }

}


如果您想檢查類型是否擴(kuò)展BaseDto,您將需要(new \ReflectionClass($type->getName()))->isSubclassOf(BaseDto::class)


注意getName指的是ReflectionNamedType::getName。在 PHP 8 之前,這是您可以獲得的唯一可能的實(shí)例,$prop->getType()但是從 PHP 8 開始,您可能還會獲得一個(gè)ReflectionUnionType包含多種類型的實(shí)例


查看完整回答
反對 回復(fù) 2022-06-11
  • 1 回答
  • 0 關(guān)注
  • 178 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號