PHP 新增匿名类

php 新增匿名类

  • 直接上代码:

// PHP 7 之前的代码
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

// 使用了 PHP 7+ 后的代码
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});
  • 可以传递参数到匿名类的构造器,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用 trait:

class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}

var_dump(new class(10) extends SomeClass implements SomeInterface {
    private $num;

    public function __construct($num)
    {
        $this->num = $num;
    }

    use SomeTrait;
});
  • 匿名类被嵌套进普通 Class 后,不能访问这个外部类(Outer class)的 private(私有)、protected(受保护)方法或者属性。
  • 访问外部类(Outer class)protected 属性或方法,匿名类可以 extend(扩展)此外部类。
  • 使用外部类(Outer class)的 private 属性,必须通过构造器传进来:
    class Outer
    {
        private $prop = 1;
        protected $prop2 = 2;

        protected function func1()
        {
            return 3;
        }

        public function func2()
        {
            return new class($this->prop) extends Outer {
                private $prop3;

                public function __construct($prop)
                {
                    $this->prop3 = $prop;
                }

                public function func3()
                {
                    return $this->prop2 + $this->prop3 + $this->func1();
                }
            };
        }
    }

    echo (new Outer)->func2()->func3();//6

获取更多信息

本作品采用《CC 协议》,转载必须注明作者和本文链接
yourself
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

这个特性从 2015 年12月3号 php7.0.0 发布到现在... 反应是不是有点慢了...

3年前 评论
yourself

@RunnerLee 好的 大佬 我会加快自己的学习速度 争取早日追赶上你

3年前 评论

@yourself 额.. 别误会, laravel-china 这个论坛的专栏功能发布的文章, 是会出现在社区首页帖子列表中的. 我的理解是你这篇写的应该是个人的笔记, 而且刚好内容主要是说了一个两年前的新特性, 出现在首页有点尴尬.

我建议你可以用 jekyll 制作你的博客, 有很多漂亮的模板, 然后用 github 或者 coding 提供的 pages 服务发布.

参考链接:

@Summer

3年前 评论
yourself

@RunnerLee 好的

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!