在PHP中访问(或声明)具有非法字符的对象成员

时间:2015-06-26 11:00:03

标签: php

我在Weather Underground上与Personal Weather Station Upload Protocol合作。我正在创建一个包含PWS可能包含的所有属性的类,然后只使用 http_build_query()来创建我的请求。

我的问题是:Weather Underground有两个字段,其中包含PHP的无效标识符名称。退房:

AqUV-AETH  -UV-AETH (second channel of Aethalometer at 370 nm) UG/M3
AqPM2.5 - PM2.5 mass - UG/M3 

我的班级不能包含这些属性名称,我该怎么办?

ERRO:

class Foo {
    public AqUV-AETH = null;
    public AqPM2.5 = null;
}

3 个答案:

答案 0 :(得分:3)

PHP支持动态添加属性到Object,所以:

class Foo{

}

$foo = new Foo();
$foo->{'AqUV-AETH'} = 'data1'; // add and init new porperty to a Object
$foo->{'AqPM2.5'} = 'data2'; 

echo $foo->{'AqUV-AETH'}; // access special porperty name with $obj->{'name'}

答案 1 :(得分:1)

Actualy你可以使这些属性像这样:

class foo {

public function __construct () {
    $this->{"AqUV-AETH"} = 1;
    $this->{"AqPM2.5"} = 600;
}}

{""}允许您使用变量名中的其他字符,只需使用相同的方式来调用它们

答案 2 :(得分:1)

这种事情在PHP中永远不会方便(在很多其他语言中也是如此)。

最简单的答案是使用数组而不是对象。数组元素名称被引用为字符串,因此没有问题。

另一个选择是在类内部使用一个数组,然后有一个"魔法" __get()方法将属性解析为名称。引用属性名称时,您需要使用{}大括号来解决PHP语法问题。

实用的解决方案可能是在PHP代码中使用某种替代字符。例如,您可以使用下划线代替连字符,因此您的属性名称为public AqUV_AETH = null;,然后在导入/导出到API时对其进行转换。

但是对于我的钱,所有人的最佳解决方案是在整个过程中提供更明智的命名属性 - 为代码中的所有属性提供有意义的名称,而不是来自API的稍微简洁的代码,然后在您的代码中包含代码用于在需要执行导入或导出时将命名属性映射到API中的名称的类。您无需在代码中坚持使用命名约定。

我希望能给你一些想法。