autoload — вызов переменной хука в переполнении стека

То, что я пытаюсь заархивировать, является своего рода автозагрузчиком переменных в php. Есть ли способ перехватить загрузку переменных в php?

Пример использования будет:

function __autoloadVar($varname,$indices){
global $$varname;

if(count($indices) > 0 && !isset($$varname[$indices[0]])){ //first index
$$varname[$indices[0]] = load_var_content($indices[0]); //this would call a function that loads a variable from the database, or another source
}
}

echo $foo["bar"]["baz"];
// => calls __autoloadVar("foo",array("bar","baz")) then accessing it

есть ли крючок для архивирования этого?

[РЕДАКТИРОВАТЬ]:
Случай использования будет то, что я пытаюсь рефакторинг загрузки языковых свойств. они хранятся в файлах, которые стали довольно загруженными и занимающими много памяти, поскольку они всегда полностью загружены, даже если они не используются.

Обмен всех переменных с помощью вызова функции не будет работать, так как для его замены потребуются месяцы, тем более что поиск и замена не будут работать, если переменные встроены в строки.

Другой рефакторинг будет состоять в том, чтобы переместить переменные в базу данных, что можно сделать в скрипте. но процесс загрузки для загрузки всех переменных за один раз слишком сильно ударил бы во время выполнения.

1

Решение

Можно сделать $foo несколько «волшебно», если вы знаете его структуру:

class Foo implements ArrayAccess {
private $bar;

public function offsetGet($name) {
switch($name) {
case "bar":
if(empty($this->bar)) $this->bar = new FooBar;
return $this->bar;
}
}
public function offsetExists($offset) {  }
public function offsetSet($offset, $value) {  }
public function offsetUnset($offset) {  }
}

class FooBar implements ArrayAccess {
private $baz;

public function offsetGet($name) {
switch($name) {
case "baz":
if(empty($this->baz)) $this->baz = new FooBarBaz;
return $this->baz;
}
}
public function offsetExists($offset) {  }
public function offsetSet($offset, $value) {  }
public function offsetUnset($offset) {  }
}

class FooBarBaz {
public function __toString() {
return "I'm FooBarBaz\n";
}
}

$foo = new Foo;
echo $foo['bar']['baz'];

Все, что возможно при таком подходе, оставлено в качестве упражнения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]