2016-03-15 90 views
2

在PHP中,有沒有什麼方法以編程方式調用對象的所有方法?PHP:遍歷所有對象方法(調用對象中的所有方法)

我有一個對象充滿包含HTML的片段方法:

class Example { 

    public function introduction(){ 

    ?> 

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 

    public function step_one(){ 

    ?> 

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 

    Etc... 
} 

有沒有什麼方法來調用所有的這些方法,以便在一個循環?或者我必須通過名字給他們打電話嗎?

+1

可以使用get_class_methods從類中獲取方法名稱,但應該拋棄「order」的概念。您定義了這些方法,但是PHP允許將它們放入任何喜歡的順序。 – kainaw

+0

除了將每個HTML片段存儲在HEREDOC數組值中,有沒有什麼方法可以對它們進行「排序」? – ibhhvc

回答

1

如果您不知道在該類中有多少種方法,但您知道每種方法的名稱的基礎。然後你就可以像這樣遍歷它們:

<?php 
class Example { 

    public static function loop() { 
    self::introduction(); 
    $name = "step_one"; 
    $int = 2; 
    $formater = new NumberFormatter("en", NumberFormatter::SPELLOUT); 
    while (true) { 
     if (method_exists(get_class(), $name)) { 
      self::$name(); 
      $number = $formater->format($int); 
      $name = "step_" . $number; 
      $int ++; 
     } 
     else { 
      break; 
     } 
    } 
    } 

    public static function introduction(){ 

    ?> 

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 

    public static function step_one(){ 

    ?> 

    <p>1Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 

    public static function step_two(){ 

    ?> 

    <p>2Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 
    public static function step_three(){ 

    ?> 

    <p>3Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 
} 
Example::loop(); 
?> 

或者可以遍歷他們聲明的順序是這樣的:

<?php 
class Example { 

    public function loop() { 
    $methods = get_class_methods(get_class()); 
    foreach ($methods as $method) { 
     if ($method != "loop") { 
     $this->$method(); 
     } 
    } 
    } 

    public function introduction(){ 

    ?> 

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 

    public function step_one(){ 

    ?> 

    <p>1Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 

    public function step_two(){ 

    ?> 

    <p>2Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 
    public function step_three(){ 

    ?> 

    <p>3Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> 

    <?php 

    } 
} 
$a = new Example(); 
$a->loop(); 
?> 
+0

非常好,謝謝。這非常有幫助。 – ibhhvc

0

感謝C.Liddell指着我在正確的方向。以下是我在構造函數中完成的操作:

public function __construct(){ 

    $methods = get_class_methods($this); 

    foreach($methods as $method) : 

    if($method === '__construct') : 

     continue; 

    endif; 

    $this->$method(); 

    endforeach; 

}