首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Anonymous (class)es

Support for anonymous classes was added in PHP 7. Anonymous classes are useful when simple, one-off objects need to be created.

代码语言:javascript
复制
<?php

//?Pre?PHP?7?code
class?Logger
{
????public?function?log($msg)
????{
????????echo?$msg;
????}
}

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

//?PHP?7+?code
$util->setLogger(new?class?{
????public?function?log($msg)
????{
????????echo?$msg;
????}
});

They can pass arguments through to their constructors, extend other classes, implement interfaces, and use traits just like a normal class can:

代码语言:javascript
复制
<?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;
});

The above example will output:

代码语言:javascript
复制
object(class@anonymous)#1 (1) {
  ["Command line code0x104c5b612":"class@anonymous":private]=>
  int(10)
}

Nesting an anonymous class within another class does not give it access to any private or protected methods or properties of that outer class. In order to use the outer class' protected properties or methods, the anonymous class can extend the outer class. To use the private properties of the outer class in the anonymous class, they must be passed through its constructor:

代码语言:javascript
复制
<?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();

The above example will output:

代码语言:javascript
复制
6

All objects created by the same anonymous class declaration are instances of that very class.

代码语言:javascript
复制
<?php
function?anonymous_class()
{
????return?new?class?{};
}

if?(get_class(anonymous_class())?===?get_class(anonymous_class()))?{
????echo?'same?class';
}?else?{
????echo?'different?class';
}

The above example will output:

代码语言:javascript
复制
same class

Note: Note that anonymous classes are assigned a name by the engine, as demonstrated in the following example. This name has to be regarded an implementation detail, which should not be relied upon. <?php echo?get\_class(new?class?{}); The above example will output something similar to: class@anonymous/in/oNi1A0x7f8636ad2021

← Traits

Overloading →

代码语言:txt
复制
 ? 1997–2017 The PHP Documentation Group

Licensed under the Creative Commons Attribution License v3.0 or later.

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com