После бесчисленных потраченных впустую часов я пришел за помощью, я не могу понять, в чем проблема. помощь в решении этого будет принята с благодарностью. Может ли кто-нибудь определить, что происходит или что я не смог сделать.
Рассматриваемый код находится в двух отдельных файлах, один из которых имеет класс 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
изменить, чтобы добавить рассматриваемые классы
Запрос.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 в cclass. чего я добиваюсь, но с 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
этапа, на котором находится это приложение, является этапом "десериализации"
php -r "echo [String];"
- person Siad Ardroumli   schedule 25.05.2019$NamespaceDataKeys
имеет кавычки вокруг всех элементов. странно то, что даже при вызове класса$sub = new $NamespaceKey(json_encode($value));
без использования строковой переменной т.е.$sub = new Data\ClientKey(json_encode($value));
выводится та же ошибка. - person jon_nfc   schedule 25.05.2019without using a string variable i.e $sub = new Data\ClientKey(json_encode($value)); the same error displays.
Пожалуйста, разместитеData\ClientKey
класс. - person Siad Ardroumli   schedule 25.05.2019