douyanjing0822 2012-05-17 17:06
浏览 84
已采纳

PHP OOP设计模式

I recently read an article on Wikipedia about Design Pattern

So far I've done this, but it returns Fatal error: Maximum function nesting level of '100' reached, aborting!

Logically I know, it will return nesting error, But, I don't understand how is the best step.

class Main {
    $this->Aa = new Aa;
    $this->Bb = new Bb;
    $this->Cc = new Cc;
    }
class Aa extends Main {
    function blahA() {
        // blah blah
        }
    function testA() {
        $ret[] = $this->blahA(); // Call inside class
        $ret[] = $this->Bb->blahB(); // Call outside class
        $ret[] = $this->Cc->blahC(); // Call outside class
        return $ret;
        }
    }
class Bb extends Main {
    function blahB() {
        // blah blah
        }
    function testB() {
        $ret[] = $this->blahB(); // Call inside class
        $ret[] = $this->Aa->blahA(); // Call outside class
        $ret[] = $this->Cc->blahC(); // Call outside class
        return $ret;
        }
    }
class Cc extends Main {
    function blahC() {
        // blah blah
        }
    function testC() {
        $ret[] = $this->blahC(); // Call inside class
        $ret[] = $this->Aa->blahA(); // Call outside class
        $ret[] = $this->Bb->blahB(); // Call outside class
        return $ret;
        }
    }

Basically i want to manage my classes design, in order the method in Aa class is also reusable in Bb class and vice versa. I curious, how to build the relationship like my classes above, How to extends the class to get above pattern? And what is the name of this pattern? please also give me a link that i can learn from.

Many Thanks,

  • 写回答

1条回答 默认 最新

  • doumu4032 2012-05-17 17:11
    关注

    Consider creating Aa and Bb separately and using Dependency Injection so each class will have a reference to the other. You should make sure the two classes are not too tightly coupled though.

    The Gang of Four (GoF) Design patterns book mentioned in the comments is a good one, but the Head First Design Patterns is a bit easier (also very enjoyable) for beginners.

    Here is an example. Notice there are better ways to set a property in PHP, I put a setter function just to be explicit. Refer to this question for more info.

    class Main {
        $this->Aa = new Aa;
        $this->Bb = new Bb;
        $this->Cc = new Cc;
    
        // Can use properties instead of setters
        $this->Aa->setB(Bb);
        $this->Aa->setC(Cc);
    
        $this->Bb->setA(Aa);
        $this->Bb->setC(Cc);
    
        $this->Bb->setA(Aa);
        $this->Bb->setC(Bb);
        }
    
    class Aa {                // No need to extend Main, right?
        function blahA() {
            // blah blah
            }
        // Dependency injection, Bb is now a member of this class
        // Consider doing this with PHP properties instead
        // Using setter function to be more explicit
        function setB(Bb b) {
            this->Bb = b;
            }
        // Dependency injection, Cc is now a member of this class
        // Consider doing this with PHP properties instead
        // Using setter function to be more explicit
        function setC(Cc c) {
            this->Cc = c;
            }
        function testA() {
            $ret[] = $this->blahA(); // Call inside class
            $ret[] = $this->Bb->blahB(); // Call outside class
            $ret[] = $this->Cc->blahC(); // Call outside class
            return $ret;
            }
        }
    // Class Bb ...
    // Class Cc ...
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 MATLAB中streamslice问题
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端