繁体   English   中英

使用未定义的常量String - 从变量调用类名时假定为'String'

[英]Use of undefined constant String - assumed 'String' when calling a class name from variable

经过无数的浪费时间,我来寻求帮助,我不能为我的生活找出问题所在。 将非常感谢协助解决这个问题。 任何人都可以识别正在发生的事情或我未能做到的事情。

有问题的代码存在于两个单独的文件中,其中一个文件具有自动加载的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传递了带有ClientKey键的JSON字符串
  • 自动加载ClientKey.Data.php,
  • E_NOTICE警告输出
  • Data\\ClientKey::__Construct方法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.phpRequest.data.php的子类型,此应用程序所在的阶段是“deSerialize”阶段

找到解决方案, Data\\ClientKey的属性$Value被错误地设置为String ,删除它并且错误消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM