我从Zend PHP学习指南中得到了这个问题,但找不到合适的解释......
<?php
class Magic {
public $a = "A";
protected $b = array("a"=>"A", "b"=>"B", "c"=>"C");
protected $c = array(1,2,3);
public function __get($v) {
echo "$v,";
return $this->b[$v];
}
public function __set($var, $val) {
echo "$var: $val,";
$this->$var = $val;
}
}
$m = new Magic();
echo $m->a.",".$m->b.",".$m->c.",";
$m->c = "CC";
echo $m->a.",".$m->b.",".$m->c;
?>
Run Code Online (Sandbox Code Playgroud)
根据指南,解决方案应为" b,c,A,B,C,c: CC,b,c,A,B,C".我无法弄清楚为什么 - 也许你呢?我的意图是$ m-> a的第一次调用会导致结果"a",但这显然是错误的......
我有一个 HTML5 文件上传对话/dropzone,它会给我这样的东西:
event.dataTransfer.files
Run Code Online (Sandbox Code Playgroud)
现在我看到为每个 File 对象设置了一些(强制性?)属性:
https://developer.mozilla.org/en-US/docs/Web/API/File
像file.name,file.lastModifiedDate等等。我可以通过这种方式获取值
event.dataTransfer.files.item(0).name
Run Code Online (Sandbox Code Playgroud)
但不要以这种方式检查该属性是否确实存在:
event.dataTransfer.files.item(0).hasOwnProperty('name')
Run Code Online (Sandbox Code Playgroud)
我了解到检查属性是否存在是一个很好的做法,hasOwnProperty()但这不适合这里。为什么呢?是因为 file.name 在某种程度上是“强制性的”吗?但是为什么值只是存储在原型链的某个地方?
我正在撕掉我的头发来完成这个...特别是对于html5检测脚本.我想要一个只设置一次并且不能再次覆盖的变量.就是这个:
var StaticConfiguration = {};
StaticConfiguration.Main = {
_html5: null
}
StaticConfiguration.getVariable = function(name) {
return StaticConfiguration.Main["_" + name];
}
StaticConfiguration.setVariable = function(name, value) {
if(StaticConfiguration.Main["_" + name] == null) {
StaticConfiguration.Main["_" + name] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我定义一个包含所有这些变量的全局对象StaticConfiguration - 在我的例子中,只是"html5".我将它设置为null,因为我想在应用程序中设置它.为此,我打电话
StaticConfiguration.setVariable("html5", "true");
Run Code Online (Sandbox Code Playgroud)
然后就定了.如果我尝试再次设置它,它会失败 - 当然,因为_html5不再是null.所以我几乎使用下划线来"隐藏"静态变量.
这对我很有帮助.我希望这是一个很好的方法 - 请告诉我,如果不是:)