首頁  >  問答  >  主體

PHP 中的動態屬性建立已被棄用:警告

我越來越多地看到這種情況,但我不確定需要做什麼來阻止此警告:

已棄用:建立動態屬性...已棄用

這是我的課:

class database {

    public $username = "root";
    public $password = "password";
    public $port = 3306;

    public function __construct($params = array())
    {
        foreach ($params as $key => $value)
        {
            $this->{$key} = $value;
        }
    }
}

這就是我實例化它的方式。

$db = new database(array(
    'database' => 'db_name',
    'server' => 'database.internal',
));

這給了我兩個訊息:

已棄用:建立動態屬性資料庫::$database 已棄用

已棄用:建立動態屬性資料庫::$server 已棄用


P粉797855790P粉797855790335 天前904

全部回覆(5)我來回復

  • P粉299174094

    P粉2991740942023-10-21 10:14:38

    該警告告訴您您嘗試設定的屬性未在類別頂部列出

    當您執行此命令時:

    class database {
    
        public $username = "root";
        public $password = "pasword";
        public $port = 3306;
    
        public function __construct($params = array())
        {
            foreach ($params as $key => $value)
            {
                $this->{$key} = $value;
            }
        }
    }
    
    $db = new database(array(
        'database' => 'db_name',
        'server' => 'database.internal',
    ));

    大致相當於這樣:

    class database {
    
        public $username = "root";
        public $password = "pasword";
        public $port = 3306;
    }
    
    $db = new database;
    $db->database = 'db_name';
    $db->server = 'database.internal';

    警告是類別定義中沒有行表示 $db->database$db->server 存在。

    目前,它們將動態建立為非類型化公共屬性,但將來,您需要明確聲明它們:

    class database {
        public $database;
        public $server;
        public $username = "root";
        public $password = "pasword";
        public $port = 3306;
    
        public function __construct($params = array())
        {
            foreach ($params as $key => $value)
            {
                $this->{$key} = $value;
            }
        }
    }
    
    $db = new database(array(
        'database' => 'db_name',
        'server' => 'database.internal',
    ));

    在一些罕見的情況下,你實際上想說「這個類別的屬性是我決定在運行時添加的任何屬性」;在這種情況下,您可以使用#[AllowDynamicProperties] 屬性,如下圖所示:

    #[AllowDynamicProperties]
    class objectWithWhateverPropertiesIWant {
        public function __construct($params = array())
        {
            foreach ($params as $key => $value)
            {
                $this->{$key} = $value;
            }
        }
    }

    回覆
    0
  • 徐涛

    啊啊大師傅

    徐涛 · 2023-10-26 17:53:30
  • 徐涛

    徐涛2023-10-27 09:34:37

    山東省濱州市***工資搭嘎發撒***哈

    回覆
    0
  • P粉098979048

    P粉0989790482023-10-21 10:03:08

    因此警告來自於新增動態類別屬性的建構子。如果您不必動態且真實地傳遞這些字段,那麼您似乎確實將簡單的事情變得過於複雜,那麼請像這樣嘗試。

    class database {
    
        public $username = "root";
        public $password = "pasword";
        public $port = 3306;
        public $database = 'db_name';
        public $server = 'database.internal';
    }
    
    
    $db = new database();

    您需要動態參數有什麼原因嗎?您也可以這樣做:

    class database {
    
        public $username = "root";
        public $password = "pasword";
        public $port = 3306;
        public $database;
        public $server;
    
        public function __construct($params = array())
        {
    
            foreach ($params as $key => $value)
            {
                $this->{$key} = $value;
            }
        }
    }

    如果您提前新增參數,它們就不是動態的,您只是為已經存在的內容指派一個值。

    現在應該可以正常工作,不會出現任何警告。

    $db = new database(array(
        'database' => 'db_name',
        'server' => 'database.internal',
    ));

    回覆
    1
  • 徐涛

    徐涛2023-10-26 17:55:40

    阿帆VS工作細胞宣傳部先擦VB

    回覆
    0
  • 取消回覆