【问题标题】:OOP implementation: Use variables in PHP function namesOOP 实现:在 PHP 函数名中使用变量
【发布时间】:2017-10-02 10:46:36
【问题描述】:

感谢您检查这个问题:我正在编写一个 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'] );
          }
      }

  }

【问题讨论】:

  • 您不会将任何变量传递给您的构造函数。所以你的类变量没有任何价值。此外,您将在构造函数的前两行覆盖$this-&gt;cm_name。我认为第一行应该是$this-&gt;cm_name_id = $cm_name_id 而不仅仅是$this-&gt;cm_name .. 另外,你为什么这样做?总是使用相同的函数名称,然后像往常一样传递参数不是更简单吗?
  • 谢谢。我已经修改了。
  • 仍然,您没有将任何值传递给您的构造函数。 $cm_name_id 并且从未定义所有这些变量。所以你的类变量也没有任何值。

标签: php wordpress oop


【解决方案1】:

简单地说,,这不是你在 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

【讨论】:

    【解决方案2】:

    恐怕这在 OOP 方面是不可能的,原因有两个。

    1. 你必须使用 $this 对象才能使用类变量
    2. 您只能在函数中使用 $this。

    但你可以从变量中调用函数

    $function_name="test_function"; $object->$function_name();

    【讨论】:

    • 或者你使用闭包;)
    • 这可能是最好的解决方案
    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多