PHP7定义常量数组和匿名类

2019-05-13 14:57 更新

PHP7 常量数组

在 PHP7 中,如果您需要定义 Array 类型的常量,那么通过使用 define()函数进行定义是一个不错的选择。使用过 PHP 5.6 版本的朋友应该知道,在 PHP5.6 中,只能使用 const 关键字来定义数组类型的常量。

常量数组实例

<?php
   //define a array using define function
   define('fruit', [
      'apple',
      'orange',
      'banana'
   ]);
   print(fruit[1]);
?>

它产生以下浏览器输出 :

orange

PHP7 匿名类

现在,您可以在 PHP7 中使用 new class 来定义(实例化)匿名类。匿名类可以用来代替完整的类定义。

匿名类实例

<?php
   interface Logger {
      public function log(string $msg);
   }

   class Application {
      private $logger;

      public function getLogger(): Logger {
         return $this->logger;
      }

      public function setLogger(Logger $logger) {
         $this->logger = $logger;
      }  
   }

   $app = new Application;
   $app->setLogger(new class implements Logger {
      public function log(string $msg) {
         print($msg);
      }
   });

   $app->getLogger()->log("My first Log Message");
?>

它产生以下浏览器输出:

My first Log Message

可以将参数传递到匿名类的构造器,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用 trait:

<?php
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;
 });
?>

它产生以下浏览器输出:

object(class@anonymous)#1 (1) {
  ["Command line code0x104c5b612":"class@anonymous":private]=>
  int(10)
}

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

<?php
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
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号