JsonSerializable segmentation fault

WMix

герр M:)ller
Партнер клуба
PHP:
echo json_encode(new class implements \JsonSerializable{
    public function jsonSerialize(){
        return clone $this;
    }
});
я все понимаю, не баг это совсем, но ошибку найти когда сложноподчиненный обжект, тяжко
 

fixxxer

К.О.
Партнер клуба
Это очень старая проблема с тем, что php в случае рекурсии сегфолтится, а не фатал кидает. Но там нет нормального решения без существенного снижения производительности.

Понять, где проблема, можно через gdb. https://derickrethans.nl/what-is-php-doing.html
 

WMix

герр M:)ller
Партнер клуба
я систему понял как сегфолты создавать
PHP:
count(new class implements \Countable {
  function count() {
    return count($this);
  }
});
PHP:
(new class{
  function __call($a,$b){
    return $this->foo();
  }
})->foo();
PHP:
(new class{
  public function __get($x){
    $a = clone $this;
    return $a->$x;
  }
})->foo;
PHP:
serialize(new class implements \Serializable{
    public function serialize() {
        return serialize(clone $this);
    }
    public function unserialize($data) {}
});
PHP:
$a = new class implements \ArrayAccess {

    public function offsetSet($offset, $value) {}
    public function offsetExists($offset) {}
    public function offsetUnset($offset) {}

    public function offsetGet($offset) {
        return $this[$offset];
    }
};
echo $a['foo'];
 

WMix

герр M:)ller
Партнер клуба
осталось дописать if rand == 42 и gdb тебе в руки... ищите
 

fixxxer

К.О.
Партнер клуба
в этих случаях xdebug с включенным xdebug.max_nesting_level должен сработать.

вот с jsonSerialize clone $this веселее - там рекурсия внутри
 
Сверху