抽象静态方法中的实例子类



我对php很陌生,我想从抽象父类的静态方法中实例化一个子类。这在php中可能吗?

我是这样做的:

父类:

<?php
namespace Appviews;

abstract class Views
{
protected $template_name = '';
abstract protected function Get();
public static function as_view($target = null, $params = null) {
// Here is this trick
$create = function () {
$cls = get_called_class();
return new $$cls();
};
$instance = $create();
$instance->Get();
}
public static function get_template() {
return self::$template_name;
}
}

儿童班:

<?php
namespace Appviews;
use AppviewsViews;
class HomeViews extends Views {
protected $template_name = 'home.html';
protected function Get() {
echo self::get_template();
dump($this);
}
}

我想这样使用它:

<?php
use AppviewsHomeView;
HomeView::as_view();

但是php抛出错误:

[Thu Sep 24 16:23:50 2020] 127.0.0.1:57001 [200]: / - Uncaught Error: Class name must be a valid object or a string in /Users/dev/PhpstormProjects/my_project/devel/src/views/Views.php:17
Stack trace:
#0 /Users/dev/PhpstormProjects/my_project/devel/src/views/Views.php(19): AppviewsViews::Appviews{closure}()
#1 /Users/dev/PhpstormProjects/my_project/devel/public/index.php(9): AppviewsViews::as_view()
#2 {main}

如果您想从静态方法中使用$template_name,那么它首先应该是static

您可以使用后期静态绑定来访问父类中的静态方法和字段:

<?php
abstract class Views
{
protected static $template_name = '';
abstract protected function Get();
public static function as_view($target = null, $params = null) {
$instance = new static();
$instance->Get();
}
public static function get_template() {
return static::$template_name;
}
}
class HomeViews extends Views {
protected static $template_name = 'home.html';
protected function Get() {
echo self::get_template() . "n";
var_dump($this);
}
}
HomeViews::as_view();
/* outputs:
home.html
object(HomeViews)#1 (0) {
}
*/

最新更新