OOP 中的参数

Arguments in OOP

我正在尝试通过将一个大函数重写为 class 来学习一点 OOP。这是与问题相关的最重要内容的表示

function my_function( $args = [] ) {

    $defaults = [
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    ];
    $args = wp_parse_args( $args, $defaults );

    $q = new WP_Query( $args );

    return $q->posts;

}

用户可以使用如下功能

echo my_function( ['key2' => 'new value'] );

key2 这里设置了一个新值,这反过来会改变 $q->posts

的输出

现在,我的问题是,如何在 OOP 中完成这项工作。我查看了 setter 和 getter,但似乎这不是我要找的。我还查看了 WP_Query class 如何在 Wordpress 中执行此操作,但坦率地说,编码非常糟糕且非常过时,绝对不是值得学习的东西。

考虑到 WP_Query class 我应该有一个 class 像

class My_Class {}

然后我就可以使用它了

$output = new My_Class( ['key2' => 'new value'] );

如何在 OOP 中设置参数 class

我认为您不需要对象。
如果你的例程总是需要 return $q->posts 转换你的函数只是为了使用方法来传递参数,那不是一个好主意。

你的classMy_Class应该有一个像这样的构造函数:

 <?php
class My_Class {
    private $attr;
    function __construct($arg) {
        $this->attr = $arg;
    }
    public function getAttr() {
        return $this->attr;
    }
}
// test
$obj = new My_Class(array('key2' => 'new value'));
var_dump ($obj->getAttr());

但是在PHP中,只允许一个构造函数,构造函数、函数和方法中没有重载...

要记住的重要一点是,classes 为您提供了一种简单的方法,可以将逻辑分成小块,同时在共享属性和方法(函数)的单个包装器(创建的对象)中维护功能.

为了回答您的问题,您提到了 getter 和 setter。在编写 class 本身时,这是两个非常有用的模式。它们为您提供了一种获取和检索值的编程方式,这些值反过来又为您提供了验证设置和获取时变异的方法。

class MyClass {

    /**
     * Declare a private class property.
     * This is useable in scope of THIS class
     * and none other, not even extensions of this class.
     * has default args populated
     **/
    private $myArgs = ["key" => "value"];

    /**
     * Constructor.
     **/
    public function __construct()
    {
        // No need for constructor to do anything if args are
        // are already assigned by default. Use the setter to
        // change them
    }

    /**
     * Get the arguments array
     **/
    public function getArgs()
    {
        return $this->myArgs;
    }

    /**
     * Set the arguments array
     * Typehint as an array to make sure myArgs will always
     * be an array and nothing else.
     **/
    public function setArgs(array $args)
    {
        $this->myArgs = $args;
    }
}

$myClass = new MyClass();

// Get the args
$args = $myClass->getArgs();

// Set the args to a new value
$myClass->setArgs(["key2" => "value2"]);

// Get the new args
$args2 = $myClass->getArgs();

我的建议是将 WP_Query 包装起来,这样可以为您完成工作:

class MyClass {

    private $defaults = array(
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    );
    private $wpQuery;

    public function __construct($args = array()) {
        $this->wpQuery = new WP_Query(wp_parse_args($args, $this->defaults));
    }

    public function getPosts() {
        return $this->wpQuery->posts;
    }

}