我正在尝试构建一个对象,其中对象的属性不直接存在于对象上,而是通过静态变量定义并存储到$data
属性中,通过用户__get
和__set
。它运作良好,直到我得到了对象。由于递归对象的问题并且无法访问stdClass
上的get getter和setter,我在内部想到我可以将对象的值存储为数组并将其强制转换为输出。不幸的是,有人做了像
$fleet->car->wheels = 4;
我马上得到
Creating default object from empty value
它似乎表明它首先尝试做外集(car->wheels
),然后是内部?这对我没有意义。对我而言,逻辑上它首先尝试从car
获取$fleet
的值,然后尝试设置wheels
。
我是否错误地考虑了这个问题,或者这是不可能的?我知道另一个解决方案是创建一个对象来保存值,使用它自己的getter / setter,但我希望尽可能少的代码。
要查看此内容的最低代码:
class Test
{
public function __set($key, $value) {
var_dump($key, $value);
}
}
$test = new Test();
$test->car->wheels = 4;
答案 0 :(得分:1)
这是逻辑上的错误。
当您设置{object}->{key1}->{key2}
时,您将获得{object}->{key1}
,然后设置返回{key1}
。因此,我尝试使用不会触发的setter这一事实当然是因为key1
中的值被设置,而不是public function __get($key) {
$test = new stdClass();
return $test;
}
本身。
所以添加
stdClass
摆脱了错误,因为首先创建了car
的新wheels
,然后将4设置为function sendMailToCheckedMembers(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(MAIN_PAGE);
var rangeToCheck = sheet.getRange("L5:P28");
var map = getMembersFromRange(rangeToCheck);
//check for errors
for (var ele in map) {
if(isErrorOrLoading(ele)){
sendError(createStringFromMap(map));
return;
}
}
//do validation stuff
//send validation mail
}
function getMembersFromRange(range){
var numRows = range.getNumRows();
var numCols = range.getNumColumns();
var map = {};
for (var i = 1; i <= numRows; i++) {
for (var j = 1; j <= numCols; j++) {
var currentCell = range.getCell(i,j).getValue();
var entryArray = currentCell.split(" ");
for(var k=0;k<entryArray.length;k++){
map[entryArray[k]] = entryArray[k];
}
}
}
return map;
}
。