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