Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用内部类?_Php_Class_Inner Classes - Fatal编程技术网

如何在PHP中使用内部类?

如何在PHP中使用内部类?,php,class,inner-classes,Php,Class,Inner Classes,我来自Java背景,我想在php中使用一个内部类。但每次我放入内部类时,都会出现语法错误。这在PHP中是可能的吗?另外,如何引用外部类?我是否可以访问其所有数据成员 <?php class OuterClass { var $x = 15; function __construct() { } class InnerClass { // error when InnerClass is static f

我来自Java背景,我想在php中使用一个内部类。但每次我放入内部类时,都会出现语法错误。这在PHP中是可能的吗?另外,如何引用外部类?我是否可以访问其所有数据成员

<?php

class OuterClass {
    var $x = 15;
    function __construct() {

    }

    class InnerClass {                  // error when InnerClass is static
        function __construct() {        // error when InnerClass is static
            echo $x;
        }
    }
}

?>

这用于特定纸牌游戏的移动类(如移动)。我认为将这些类放在一起是一个很好的设计,因为它们之间没有任何区别。此外,MoveClass需要了解Game类的一些数据成员。为什么不把它变成一个函数呢?它实在太大了

编辑:


嵌套类呢?据我所知,它们必须是静态的?O_O

你不能那样嵌套类


查看的“扩展”部分。

PHP不允许内部类。如果您希望访问父类中的所有数据成员,我建议您使用继承

一种可能的替代方案:

class OuterClass {
    var $x = 15;
    function __construct() {

    }
}
class ChildClass extends OuterClass {
    function __construct() {
        parent::__construct();
    }
}

通过引用父类本身,可以从父类中调用一个方法;在PHP中,您可以使用
parent
关键字执行此操作。因此,为了在类的上下文中引用方法而不是对象,我们使用了
,而不是
->

,您可能需要使用stdClass。这里有一个关于它的问题:

在PHP5.4或更高版本中,您可以使用PHP特性,这些特性更多地是为多重继承而设计的,但可能适合您的需要。从PHP文档中:

一种特质类似于一个类,但只用于分组 以细粒度和一致的方式提供功能。这是不可能的 单独实例化一个特征。这是对传统文化的补充 继承并支持行为的横向组合;就是, 不需要继承的类成员的应用程序


如对的评论中所述,PHP 7中添加了此功能的PHP版本。它似乎并没有提供你想要的东西。但是,它应该为您提供类似的设计模式

以下是RFC,描述了其工作原理:


正如在另一个答案的评论中提到的,在RFC页面中搜索“嵌套”以查看外部类中嵌套的示例。

我明白了……但是继承对我所做的事情没有意义,它不会真正遵循“是一个”规则。我可以传递必要的成员或外部类,或者持有外部类的引用。谢谢你的回复!遗憾的是,似乎不能像匿名函数那样使用匿名类作为值。您只能使用它来实例化对象。