使用具有扩展实例值的静态父实例
Use static parent instance with extended instance values
我有一个主class
abstract class Database
{
protected $table;
public function where(array $params)
{
// ...
}
public function get()
{
// ...
}
}
然后我使用 class:
的扩展版本
Users extends Database
{
protected $table = 'users';
}
现在,每当我需要 select 用户时,我只需使用:
$db = new Users();
$results = $db->where(['id' => 1])->get();
这很好用,但我决定专门为 id 请求创建一个静态快捷方式会很好,但我在统计上初始化 class 时遇到问题。
我创建了一个方法 fetch
,它应该设置 Id 并使用找到的对象创建 return。
class Database // Had to drop abstract, since self cant be used
{
protected $table;
public static function fetch(int $id)
{
$self = new self;
$result = $self->where(['id' => $id])->get();
return $result;
}
}
但是,正如我评论的那样,self
不能抽象使用,所以我不得不放弃它 并且 它创建了一个没有 [=16= 的新实例] 值,因为它在父 class.
中是空的
有什么想法可以实现吗?
您正试图在 运行 时解决 class。 self
帮不了你。为此,您需要使用 static
。继续阅读 late static bindings。
class Database // Had to drop abstract, since self cant be used
{
protected $table;
public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();
return $result;
}
}
由于您使用的是 self
,因此在 运行 时您将获得原始基数 class(实际使用 self
的 class ).通过使用 static
,您会得到 class,其中代码实际上是 运行。
在方法中使用static
代替self
:
public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();
return $result;
}
这样您将获得扩展 class 的实例(例如 Users
),但不是声明方法的实例(即 Database
)。
我有一个主class
abstract class Database
{
protected $table;
public function where(array $params)
{
// ...
}
public function get()
{
// ...
}
}
然后我使用 class:
的扩展版本Users extends Database
{
protected $table = 'users';
}
现在,每当我需要 select 用户时,我只需使用:
$db = new Users();
$results = $db->where(['id' => 1])->get();
这很好用,但我决定专门为 id 请求创建一个静态快捷方式会很好,但我在统计上初始化 class 时遇到问题。
我创建了一个方法 fetch
,它应该设置 Id 并使用找到的对象创建 return。
class Database // Had to drop abstract, since self cant be used
{
protected $table;
public static function fetch(int $id)
{
$self = new self;
$result = $self->where(['id' => $id])->get();
return $result;
}
}
但是,正如我评论的那样,self
不能抽象使用,所以我不得不放弃它 并且 它创建了一个没有 [=16= 的新实例] 值,因为它在父 class.
有什么想法可以实现吗?
您正试图在 运行 时解决 class。 self
帮不了你。为此,您需要使用 static
。继续阅读 late static bindings。
class Database // Had to drop abstract, since self cant be used
{
protected $table;
public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();
return $result;
}
}
由于您使用的是 self
,因此在 运行 时您将获得原始基数 class(实际使用 self
的 class ).通过使用 static
,您会得到 class,其中代码实际上是 运行。
在方法中使用static
代替self
:
public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();
return $result;
}
这样您将获得扩展 class 的实例(例如 Users
),但不是声明方法的实例(即 Database
)。