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;
}
}
我正在尝试通过将一个大函数重写为 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;
}
}