将对象属性设置为数组值

时间:2017-11-20 22:54:18

标签: php oop

我正在尝试构建一个对象,其中对象的属性不直接存在于对象上,而是通过静态变量定义并存储到$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;

1 个答案:

答案 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; }