2010-05-30 68 views
2

我是PHP的OOP的忠实粉丝,但我觉得像定义类方法得到混乱如此之快。在C++中,我在OOP中拥有相当不错的背景,而且我对它在那里的处理方式很满意,并且很好奇在php中是否有类似的方法来处理它。PHP OOP函数声明

更具体地说,这里是我的意思。我喜欢在C++中如何定义类头(myclass.h),然后在实现文件(myclass.cc)中定义函数的实际细节。我发现,这可以很容易地复制使用php中的接口,但我还没有找到一个好的解决方案如下:

我喜欢根据它们如何访问,在不同的文件中组织我的代码,例如,公开的方法可以在班级之外调用,而私人方法将在其他地方组织 - 这是个人偏好。

伊夫试图在PHP定义像类方法:

private function MyPHPClass::myFunction(){ } 

当定义ISNT直接在类块中({}),但我还没有过任何成功这样做。

我已经通过php.net的所有网页,但没有找到像这样的东西。我假设没有这样的支持,但我想我会问。

谢谢

回答

2

你不能这样做。类声明与Java类似。

您必须将所有内容放在一个文件中,或者至少要有一些帮助类 - 它们只是您转发或调用的静态方法,或者将您的某些实现推迟到封装对象。您还可以使用__call__callstatic魔术方法来减少存根的大小,但只适用于公共方法,我建议您避免使用神奇方法。 EDI2:正如RobertPitt在评论中指出的那样,您应该考虑在几个类之间划分功能的替代策略。它还有一个额外的好处,它可以使你的代码更加分离。如果你需要,你仍然可以将几个类的功能统一在幕墙后面。

编辑:通过使用神奇的方法,我的意思是这样的:

class MyClassHelper { 

    public function method_one(array $args) { 
     ... 
    } 

    public function method_two(array $args) { 
     ... 
    } 
} 

class MyClass { 
    /** 
    * @var MyClassHelper 
    */ 
    private $helper; 

    private static $ALLOWED_METHODS = array("method_one" => NULL, 
     "method_two" => NULL); 

    public function __call($name, $arguments) { 
     $name = strtolower($name); 
     if (array_key_exists($name, self::$ALLOWED_METHODS) { 
      $helper->$name($arguments); 
     } 
     else 
      throw new Exception(...); 
    } 
} 

我建议你避免这种情况,有很多陷阱,以这个(处理引用,没有代码完成)。

+0

请问您为什么要尽量避免magic_methods?谢谢 – RobertPitt 2010-05-30 17:41:34

+0

魔法方法比普通方法慢,所以避免它们通常是个好主意。 – Maerlyn 2010-05-30 19:12:27

+0

我同意他们比命名方法的命名要慢,但是如果这个类是一个泛型类,并且可能不需要单独使用100-200个方法,但是当涉及到这个方法时,__get/__ set/__ call系统会更有效率,例如$输入 - >的get-> ID( 'INT');而不是实际定义id()作为一种方法,只是为了从存储中获取它而实际使用。我明白你的观点,但在某些情况下,它很好,值得一些。 – RobertPitt 2010-05-30 21:48:08

1

我不是一个真正的C++/C#程序员,但在PHP界面我可以给你一个检查,看看这是否有帮助。

接口

interface IDatabase 
{ 
    public function connect($dns = ''); 
    public function disconnect($flushCache = false); //Do not use braces, Code free in interfaces 
} 

数据库抽象基类

abstract class Database 
{ 
    //Some driver logic here to laod mysql,oracle etc 
} 

MySQL驱动

class DBDriver_MySQl extends Database implements IDatabase 
{ 
    public function connect($dns = '') 
    { 
    //Connection logic. 
    } 
    public function disconnect($flushDns) 
    { 
    //Disconnect Login 
    } 
} 

希望这是你在找什么。

+0

问题是你没有PHP中的多重继承,就像你在C++中一样。 – Artefacto 2010-05-30 17:50:24

+0

http://stackoverflow.com/questions/90982/multiple-inheritance-in-php – RobertPitt 2010-05-30 18:50:32

+0

你错过了这一点。你的具体例子是有道理的,但没有解决OP的一般问题。基本上,你放弃了你唯一的具体继承机会。如果OP已经想要扩展某个类并且仍然想要分离几个实现,那将会失败。当然,你可以说他应该考虑其他方法,包括策略模式,因为他要完成的是不好的练习,我同意。 – Artefacto 2010-05-30 19:13:54