//直接定义$objA=newclass{publicfunctiongetName(){echo"I39;mobjA";}};$objA->getName();//方法中返回functiontestA(){returnnewclass{publicfunctiongetName(){echo"I'mtestA'sobj";}};}$objB=testA();$objB->getName();//作为参数functiontestB($testBobj){echo$testBobj->getName();}testB(newclass{publicfunctiongetName(){echo"I'mtestB'sobj";}});
一次性给出了三种匿名类的利用方法。匿名类可以直接定义给变量,可以在方法中利用return返回,也可以当做参数通报给方法内部。实在,匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。
//继续、接口、访问掌握等classA{public$propA='A';publicfunctiongetProp(){echo$this->propA;}}traitB{publicfunctiongetName(){echo'traitB';}}interfaceC{publicfunctionshow();}$p4='b4';$objC=newclass($p4)extendsAimplementsC{useB;private$prop1='b1';protected$prop2='b2';public$prop3='b3';publicfunction__construct($prop4){echo$prop4;}publicfunctiongetProp(){parent::getProp();echo$this->prop1,'===',$this->prop2,'===',$this->prop3,'===',$this->propA;$this->getName();$this->show();}publicfunctionshow(){echo'show';}};$objC->getProp();
匿名类和普通类一样,可以继续其他类,可以实现接口,当然也包括各种访问掌握的能力。也便是说,匿名类在利用方面和普通类并没有什么不同。但如果用get_class()获取类名将是系统自动天生的类名。相同的匿名类返回的名称当然也是相同的。
//匿名类的名称是通过引擎授予的var_dump(get_class($objC));//声明的同一个匿名类,所创建的工具都是这个类的实例var_dump(get_class(testA())==get_class(testA()));
那么匿名类中的静态成员呢?当然也和普通类一样,静态成员是属于类而不是实例的。
//静态变量functiontestD(){returnnewclass{publicstatic$name;};}$objD1=testD();$objD1::$name='objD1';$objD2=testD();$objD2::$name='objD2';echo$objD1::$name;
当类中的静态变量修正时,所有类实例的这个静态变量都会随着变革。这也是普通类静态成员的特性。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E5%8C%BF%E5%90%8D%E7%B1%BB%E7%9A%84%E7%94%A8%E6%B3%95.php
参考文档: https://www.php.net/manual/zh/language.oop5.anonymous.php