Php 在雄辩模型的构造函数中创建闭包作为类变量

Php 在雄辩模型的构造函数中创建闭包作为类变量,php,laravel,eloquent,Php,Laravel,Eloquent,我正在尝试创建一个lambda风格的闭包,作为一个动态命名的类变量,在一个雄辩的模型的构造函数中 当对象被实例化时,它工作正常,但创建模型时除外(也就是说,读取、更新和删除工作正常) 我可以通过在实例化对象之前显式声明类变量来解决这个问题,但是,这只是一个技巧,我需要能够动态创建类变量(作为闭包) 下面的代码可以工作,但如果我删除$public foo声明,则会失败 public $foo; public function __construct() { $foo = 'foo';

我正在尝试创建一个lambda风格的闭包,作为一个动态命名的类变量,在一个雄辩的模型的构造函数中

当对象被实例化时,它工作正常,但创建模型时除外(也就是说,读取、更新和删除工作正常)

我可以通过在实例化对象之前显式声明类变量来解决这个问题,但是,这只是一个技巧,我需要能够动态创建类变量(作为闭包)

下面的代码可以工作,但如果我删除$public foo声明,则会失败

public $foo;
public function __construct() {
    $foo = 'foo';
    $this->{$foo} = function ($args) { return 'foo';};
}
我得到以下错误:

异常“ErrorException”,消息为“类闭包的对象” 无法在中转换为字符串' /Users/Sites/../vendor/laravel/framework/src/illumb/Support/helpers.php:900


正如我提到的,这只发生在创建/插入对象时(抱歉,如果这听起来很模糊,但是熟悉Laravel的人应该知道我的意思)。。。在其他情况下实例化模型(读取/更新/删除)效果很好。任何关于问题原因的想法都将不胜感激

在您的模型上覆盖
setAttribute
getAttribute

protected $closures = [];

public function setAttribute($key, $value)
{
    if ($value instanceof \Closure)
    {
        $this->setClosureProperty($key, $value);
    }

    parent::setAttribute($key, $value);
}

public function getAttribute($key)
{
    if (array_key_exists($key, $this->closures)
    {
        return $this->closures[$key];
    }

    return parent::getAttribute($key);
}

public function setClosureProperty($key, \Closure $value)
{
    $this->closures[$key] = $value;
}

这样,克隆将不会保存在
属性
数组中,因此不会保存并转换为字符串。

在您的模型上覆盖
设置属性
获取属性

protected $closures = [];

public function setAttribute($key, $value)
{
    if ($value instanceof \Closure)
    {
        $this->setClosureProperty($key, $value);
    }

    parent::setAttribute($key, $value);
}

public function getAttribute($key)
{
    if (array_key_exists($key, $this->closures)
    {
        return $this->closures[$key];
    }

    return parent::getAttribute($key);
}

public function setClosureProperty($key, \Closure $value)
{
    $this->closures[$key] = $value;
}

这样,克隆将不会保存在
属性
数组中,因此不会保存并转换为字符串。

在您的模型上覆盖
设置属性
获取属性

protected $closures = [];

public function setAttribute($key, $value)
{
    if ($value instanceof \Closure)
    {
        $this->setClosureProperty($key, $value);
    }

    parent::setAttribute($key, $value);
}

public function getAttribute($key)
{
    if (array_key_exists($key, $this->closures)
    {
        return $this->closures[$key];
    }

    return parent::getAttribute($key);
}

public function setClosureProperty($key, \Closure $value)
{
    $this->closures[$key] = $value;
}

这样,克隆将不会保存在
属性
数组中,因此不会保存并转换为字符串。

在您的模型上覆盖
设置属性
获取属性

protected $closures = [];

public function setAttribute($key, $value)
{
    if ($value instanceof \Closure)
    {
        $this->setClosureProperty($key, $value);
    }

    parent::setAttribute($key, $value);
}

public function getAttribute($key)
{
    if (array_key_exists($key, $this->closures)
    {
        return $this->closures[$key];
    }

    return parent::getAttribute($key);
}

public function setClosureProperty($key, \Closure $value)
{
    $this->closures[$key] = $value;
}


这样,克隆就不会保存在
属性
数组中,因此不会保存并转换为字符串。

如果您试图存储此对象,则会遇到此问题。。。。您是否考虑过创建一个访问器方法?您能解释一下为什么会发生这种情况吗?访问器方法并不是一个真正的选项。没有什么可以解释的,它是“设计的行为”。PHP不能做你想做的事。。。您不能将闭包强制转换为字符串,因此您不能序列化,因此不能在会话或类似会话中存储闭包。。。问题似乎是存储带有Elount/Laravel的记录。@hunter为什么要使用此功能?如果您试图存储此对象,则会遇到此问题。。。。您是否考虑过创建一个访问器方法?您能解释一下为什么会发生这种情况吗?访问器方法并不是一个真正的选项。没有什么可以解释的,它是“设计的行为”。PHP不能做你想做的事。。。您不能将闭包强制转换为字符串,因此您不能序列化,因此不能在会话或类似会话中存储闭包。。。问题似乎是存储带有Elount/Laravel的记录。@hunter为什么要使用此功能?如果您试图存储此对象,则会遇到此问题。。。。您是否考虑过创建一个访问器方法?您能解释一下为什么会发生这种情况吗?访问器方法并不是一个真正的选项。没有什么可以解释的,它是“设计的行为”。PHP不能做你想做的事。。。您不能将闭包强制转换为字符串,因此您不能序列化,因此不能在会话或类似会话中存储闭包。。。问题似乎是存储带有Elount/Laravel的记录。@hunter为什么要使用此功能?如果您试图存储此对象,则会遇到此问题。。。。您是否考虑过创建一个访问器方法?您能解释一下为什么会发生这种情况吗?访问器方法并不是一个真正的选项。没有什么可以解释的,它是“设计的行为”。PHP不能做你想做的事。。。您不能将闭包强制转换为字符串,因此您不能序列化,因此不能在会话或类似会话中存储闭包。。。问题似乎是存储带有Elount/Laravel的记录。@hunter为什么需要这样的功能?印象深刻:很好solution@JarekTkaczyk-我使用闭包动态地(在基类中)定义模型关系:很好solution@JarekTkaczyk-我使用闭包动态定义模型关系(在基类中)印象深刻:很好solution@JarekTkaczyk-我使用闭包动态地(在基类中)定义模型关系:很好solution@JarekTkaczyk-我使用闭包动态定义模型关系(在基类中)