栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PHP中的嵌套或内部类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PHP中的嵌套或内部类

介绍:

嵌套类与其他类的关系与外部类略有不同。以Java为例:

非静态嵌套类可以访问封闭类的其他成员,即使它们被声明为私有的也是如此。同样,非静态嵌套类要求实例化父类的实例。

OuterClass outerObj = new OuterClass(arguments);outerObj.InnerClass innerObj = outerObj.new InnerClass(arguments);

使用它们有几个令人信服的原因:

  • 这是一种对仅在一个地方使用的类进行逻辑分组的方法。

如果一个类仅对其他一个类有用,那么将其关联并嵌入该类并将两者保持在一起是合乎逻辑的。

  • 它增加了封装。

考虑两个顶级类A和B,其中B需要访问A的成员,否则将其声明为私有。通过将类B隐藏在类A中,可以将A的成员声明为私有,而B可以访问它们。另外,B本身可以对外界隐藏。

  • 嵌套类可以导致更具可读性和可维护性的代码。

嵌套类通常与其父类相关,并一起形成一个“包”

在PHP中

如果没有嵌套类,则在PHP中可以具有 类似的 行为。

如果您要实现的只是结构/组织,如Package.OuterClass.InnerClass,则PHP名称空间可能就足够了。您甚至可以在同一文件中声明多个名称空间(尽管由于标准的自动加载功能,可能不建议这样做)。

namespace;class OuterClass {}namespace OuterClass;class InnerClass {}

如果您希望模拟其他特征,例如成员可见性,则需要花费更多的精力。

定义“包装”类

namespace {    class Package {                protected function __construct() {}                public function __call($method, $args) { //class name $class = get_class($this);  if (method_exists($this, $method)) {          $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);     if (isset($trace[2])) {         $ref = new ReflectionClass($trace[2]['class']);         if ($ref->isSubclassOf(__CLASS__)) {  return $this->$method($args);         }     }     throw new Exception("Call to private method $class::$method()"); } else {     throw new Exception("Call to undefined method $class::$method()"); }        }    }}

用例

namespace Package {    class MyParent extends Package {        public $publicChild;        protected $protectedChild;        public function __construct() { //instantiate public child inside parent $this->publicChild = new PackageMyParentPublicChild(); //instantiate protected child inside parent $this->protectedChild = new PackageMyParentProtectedChild();        }        public function test() { echo "Call from parent -> "; $this->publicChild->protectedMethod(); $this->protectedChild->protectedMethod(); echo "<br>Siblings<br>"; $this->publicChild->callSibling($this->protectedChild);        }    }}namespace PackageMyParent{    class PublicChild extends Package {        //Makes the constructor public, hence callable from outside         public function __construct() {}        protected function protectedMethod() { echo "I'm ".get_class($this)." protected method<br>";        }        protected function callSibling($sibling) { echo "Call from " . get_class($this) . " -> "; $sibling->protectedMethod();        }    }    class ProtectedChild extends Package {         protected function protectedMethod() { echo "I'm ".get_class($this)." protected method<br>";        }        protected function callSibling($sibling) { echo "Call from " . get_class($this) . " -> "; $sibling->protectedMethod();        }    }}

测试中

$parent = new PackageMyParent();$parent->test();$pubChild = new PackageMyParentPublicChild();//create new public child (possible)$protChild = new PackageMyParentProtectedChild(); //create new protected child (ERROR)

输出:

Call from parent -> I'm Package protected methodI'm Package protected methodSiblingsCall from Package -> I'm Package protected methodFatal error: Call to protected Package::__construct() from invalid context

注意:

我真的不认为尝试在PHP中模拟innerClasses是一个好主意。我认为代码不太清晰易读。另外,可能还有其他方法可以使用完善的模式来获得相似的结果,例如观察者,装饰或合并模式。有时,即使是简单的继承也已足够。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号