在PHP中,内部类(也称为嵌套类)是指在一个类的内部定义的类。PHP支持在类内部定义其他类,这些内部类可以是静态的或非静态的。以下是一些关于PHP内部类的关键点:
非静态内部类(也称为成员类)是定义在另一个类内部的普通类。它们可以访问外部类的成员变量和方法,但需要外部类的实例来创建内部类的实例。
class OuterClass {
private $outerProperty = "Outer Property";
public function outerMethod() {
echo "Outer Method\n";
}
class InnerClass {
public function innerMethod() {
// 不能直接访问外部类的成员
// echo $this->outerProperty; // 错误
// $this->outerMethod(); // 错误
echo "Inner Method\n";
}
}
}
$outer = new OuterClass();
$inner = new OuterClass\InnerClass(); // 创建内部类的实例
$inner->innerMethod();
静态内部类是定义在另一个类内部的静态类。它们不能访问外部类的非静态成员,但可以直接通过外部类的类名来访问。
class OuterClass {
private static $outerStaticProperty = "Outer Static Property";
public static function outerStaticMethod() {
echo "Outer Static Method\n";
}
static class InnerStaticClass {
public function innerStaticMethod() {
// 可以访问外部类的静态成员
echo self::$outerStaticProperty . "\n";
self::outerStaticMethod();
echo "Inner Static Method\n";
}
}
}
$innerStatic = new OuterClass\InnerStaticClass(); // 创建静态内部类的实例
$innerStatic->innerStaticMethod();
PHP 7引入了匿名类,它们是没有名字的内部类,通常用于一次性使用的场景。
$anonymous = new class {
public function anonymousMethod() {
echo "Anonymous Method\n";
}
};
$anonymous->anonymousMethod();
内部类的访问控制与普通类相同,可以是public
、protected
或private
。如果内部类是private
,则只能在外部类内部实例化。
class OuterClass {
private class PrivateInnerClass {
public function privateInnerMethod() {
echo "Private Inner Method\n";
}
}
public function createInnerClass() {
$inner = new self\PrivateInnerClass();
$inner->privateInnerMethod();
}
}
$outer = new OuterClass();
$outer->createInnerClass(); // 只能在外部类内部实例化私有内部类
内部类的命名空间与外部类相同。如果外部类在某个命名空间中,内部类也会在该命名空间中。
namespace MyNamespace;
class OuterClass {
class InnerClass {
public function innerMethod() {
echo "Inner Method in MyNamespace\n";
}
}
}
$inner = new \MyNamespace\OuterClass\InnerClass();
$inner->innerMethod();
PHP中的内部类提供了在类内部定义其他类的能力,可以是静态的或非静态的。它们可以访问外部类的成员(取决于静态性),并且可以有不同的访问控制级别。匿名类则提供了一种简洁的方式来定义一次性使用的类。