Использование неопределенной константы String - предполагается «String» при вызове имени класса из переменной - PullRequest
0 голосов
/ 25 мая 2019

После бесчисленных потраченных часов я прихожу за помощью, я не могу понять, в чем проблема. помощь в решении этой проблемы будет принята с благодарностью. Кто-нибудь может определить, что происходит или что я не смог сделать.

Данный код находится в двух отдельных файлах, один из которых имеет класс Data\Request, который автоматически загружается. ошибка выводится в строке 302, которая является вызовом того же пространства имен, отдельного файла и отдельного класса, равного Data\ClientKey. Все классы, использующие эту строку, выдают одну и ту же ошибку.

ошибка: Notice: Use of undefined constant String - assumed 'String' in data/request.data.php on line 302

Код работает, и соответствующий класс вызывается, так как приложение работает, как предполагалось, но я получаю эту ошибку. Я объявил strict_types=1, даже удаление его не устраняет ошибку.

код, в котором установлена ​​переменная имени класса


$NamespaceDataKeys = array('ServerKey', 'ClientKey', 'UserInfo', 'MachineInfo', 'Data');

                    if( in_array($key, $NamespaceDataKeys) ) {

                        $NamespaceKey = "Data\\$key";

                    }else{
                        $NamespaceKey = $key;
                    }

строка 302:

$sub = new $NamespaceKey(json_encode($value));

Я пытался добавить двойные кавычки вокруг $value, когда объявил $NamespaceKey, установив для него тип String, ничего не устранило ошибку.

не знаю, если это уместно, но на всякий случай все элементы в массиве $NamespaceDataKeys являются переменными в классе Request, а также являются классами в Data пространстве имен


изменить, чтобы добавить рассматриваемые классы

Request.data.php

<?php declare(strict_types=1);

Namespace Data;

class Request implements \JsonSerializable {

    Private $Action;

    Private $Direction;

    Private $ServerKey;

    Private $ClientKey;

    public function __construct($json = false) {
        if( DEBUG ) echo '[DEBUG] Class: ' . __CLASS__ . ' Method: ' . __METHOD__ . "\r\n";

        if( $json) { 

            $this -> set($json); 

            //Log the request to the database
        }

    }

// code removed to keep size small

    private function set( string $JSONData) {

        $data = json_decode($JSONData, true);

        foreach( $data AS $key => $value ) {

            if( DEBUG ) echo "Key: [$key] ";

            if( property_exists(__CLASS__,$key) ) {

                if( is_array($value) ) {
                    if( DEBUG ) echo "Value: [Array]\r\n";


                    $NamespaceDataKeys = array('ServerKey', 'ClientKey', 'UserInfo', 'MachineInfo', 'Data');

                    if( in_array($key, $NamespaceDataKeys) ) {

                        $NamespaceKey = "\\Data\\$key";

                    }else{
                        $NamespaceKey = $key;
                    }

                    if(count(array_filter(array_keys($value), 'is_string')) > 0 && $key <> "Data") { // assositaive array


                        $sub = new $NamespaceKey(json_encode($value));
                        $this -> {$key} = $sub;

                    }else{ // numrical array

                        if($this -> ItemType <= 4 ) $key = "Node";
                        $NamespaceKey = "Data\\$key";
                        for($i=0;$i<=(count($value)-1); $i++) {



                            $sub = $NamespaceKey(json_encode($value[$i]));

                            if($key == 'Node' ) {
                                $this -> Data = (object) $sub;

                            }else{
                                $this -> {$key}[$i] = (object) $sub;

                            }
                        }

                    }


    Public Function ClientKey( $Value = "" ) : UUID {
      if( DEBUG ) echo '[DEBUG] Method: ' . __METHOD__ . "\r\n";

        if( $Value != "" ) {
            $UUID = New UUID();
            $UUID -> Value = $Value;
            $this -> ClientKey = (Object) $UUID;

            #Return (Object) $Value;

        }else{
            if( $this -> ClientKey != Null ) {
                Return (Object) $this -> ClientKey;
            }
        }

        Return new ClientKey;
    } #EoF ClientKey

?>

ClientKey.data.php

<?php declare(strict_types=1);
Namespace Data;

class ClientKey implements \JsonSerializable {

    public $Value = String;

    public function __construct( String $json = 'false') {
        $this->Value = Null;
        if( DEBUG ) echo '[DEBUG] Class: ' . __CLASS__ . ' Method: ' . __METHOD__ . "\r\n";
        if( $json <> 'false' ) { $this -> set($json); }

    private function set($JSONData) {
      if( DEBUG ) echo '[DEBUG] Method: ' . __METHOD__ . "\r\n";
        $data = json_decode($JSONData, true);

        foreach( $data AS $key => $value ) {

            if( property_exists(__CLASS__,$key) ) {

                if( DEBUG ) echo "Key: [$key] ";

                if( is_array($value) ) {
                    if( DEBUG ) echo "Value: [Array]\r\n";

                    $sub = new $key(json_encode($value));
                    $this -> {$key} = (object) $sub;


                }else{
                    if( DEBUG ) echo "Value: [$value]\r\n";
                    $this -> {$key} = $value;

                }
            }
        }
    } # EoF Set

    Public Function jsonSerialize($pretty = false) {

        if( $pretty ) {
            return json_encode(get_object_vars($this), JSON_PRETTY_PRINT);
        }else{
            return json_encode(get_object_vars($this));
        }
    }



} # EoF Class

?>

Отладка приложения: этот вывод отладки поступает из самого приложения. Это показывает следующее:

  • Request.Data.php передано JSON строка с ключом ClientKey
  • автозагрузка ClientKey.Data.php,
  • Выход предупреждения E_NOTICE
  • метод бега Data\ClientKey::__Construct
  • установить свойство, Value класса Data\ClientKey::Value _

Самое простое, чего я пытаюсь достичь без ошибок, - это сериализовать / десериализовать данные JSON в класс. который я заболел, но с E_NOTICE

Key: [ClientKey] Value: [Array]
[DEBUG] Autoload Method: {closure}-Class Name: Data\ClientKey
[DEBUG] Autoload path: data/ClientKey.data.php
<br />
<b>Warning</b>:  Use of undefined constant String - assumed 'String' (this will throw an Error in a future version of PHP) in <b>/var/www/html/data/Request.data.php</b> on line <b>302</b><br />
[DEBUG] Class: Data\ClientKey Method: Data\ClientKey::__construct
[DEBUG] Method: Data\ClientKey::set
Key: [Value] Value: [D49AD5645F8310896545C0D3354ECC0A]

поток приложения: данные JSON десериализованы в класс Request.data.php. Client.Data.php является подтипом для Request.data.php стадия, в которой находится это приложение, это фаза "deSerialize"

1 Ответ

0 голосов
/ 26 мая 2019

решение найдено, свойство $Value в Data\ClientKey было неправильно установлено с String, удалило это и ошибка исчезла.

...