OOP实现:在PHP函数名中使用变量

时间:2017-10-02 10:46:37

标签: php wordpress oop

感谢您查看这个问题:我正在编写一个WordPress主题,我想使用面向对象的编程使该类可以重用于我正在创建的几个元数据库。但是,我在尝试使用变量连接到我的函数名时遇到错误。请帮我节省几个小时,我在文档和PHP: Variable in a function name

中找不到任何内容
class custom_metabox
  {

      private $cm_name_id;
      private $cm_name;
      private $cpt_name;

      function __construct( $cm_name_id, $cm_name, $cpt_name ) {
          $this->cm_name_id = $cm_name_id;
          $this->cm_name = $cm_name;
          $this->cpt_name = $cpt_name;
          add_action( 'add_meta_boxes', array( $this, $cm_name_id . '_add_metabox_box' ) );
          add_action( 'save_post', array( $this, $cm_name_id . '_box_save_postdata' ) );
      }


      /* Add metabox */
      function $cm_name_id . _add_metabox_box() {
        add_meta_box(
            $cm_name_id . '_box_id',     //ID for box
            $cm_name,    //Name for the box
            $cm_name_id . '_box',        //function for input
            $cpt_name,            //id for CPT
            'normal',            //location of input
            'high'               //priority
        );
      }

      /* Prints the box content */
      function $cm_name_id . _box( $post ) { ?>
          <input  class="widefat"
                  placeholder="option goes here"
                  name="<?php echo $cm_name_id; ?>_box_field"
                  id="<?php echo $cm_name_id; ?>_box_field"
                  value="<?php echo esc_html( get_post_meta( $post->ID, $cm_name_id . '_box_meta_value_key', true ) ); ?>" />
      <?php }

      /* Saves the value for the box content */
      function $cm_name_id . _box_save_postdata( $post_id ) {
          if ( array_key_exists('client_box_field', $_POST ) ) {
              update_post_meta( $post_id, 'client_box_meta_value_key', $_POST['client_box_field'] );
          }
      }

  }

2 个答案:

答案 0 :(得分:2)

简单地说,没有,这不是你可以在PHP中做的事情。

根据你的课程定义,这没有多大意义。这些方法是基于类成员变量的值来定义的,因此他们不应该在名称中引用该值。

class Foo
{
  private $id;

  public function __construct($id)
  {
    $this->id = $id;
  }

  public function doSomething()
  {
    // You already know which ID this instance refers to
  }
}

从您的代码中,您可能希望在同一个类的实例上提供多个方法名称,这不是标准的OO。您的实例一次只引用一个ID - 当您为另一个方法调用方法时,您希望它如何表现?

静态方法可用于不属于某个类实例的行为,但请仔细考虑您在此处设计的内容。

PHP提供的是__call__callStatic魔术方法,只要在类的实例上调用不存在的方法,就会调用这些方法。您可以在此处详细了解这些内容:http://php.net/manual/en/language.oop5.overloading.php#object.call

答案 1 :(得分:0)

因为两个原因,我担心OOP是不可能的。

  1. 您必须使用$ this对象来使用类变量
  2. 你只能在一个函数中使用$ this。
  3. 但你可以从变量

    调用函数

    $ function_name =“test_function”; $对象 - &GT; $函数名();