PHP:迭代所有对象方法(调用对象中的所有方法)

3
在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 函数来获取类中的方法名称,但是“顺序”这个概念应该被抛弃。虽然你定义了这些方法,但 PHP 可以按照任意顺序排列它们。 - kainaw
除了将每个HTML片段存储在HEREDOC数组值中,还有没有其他方法可以“排序”它们? - ibhhvc
2个回答

4
如果您不知道将在该类中有多少方法,但您知道每个方法的名称基础。那么您可以按照以下方式迭代它们:
<?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();
?>

1
感谢C.Liddell指引我正确的方向。这是我在构造函数中最终采取的做法:
public function __construct(){

  $methods = get_class_methods($this);

  foreach($methods as $method) :

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

      continue;

    endif;

    $this->$method();

  endforeach;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接