gpt4 book ai didi

php - 数组作为类属性?

转载 作者:可可西里 更新时间:2023-11-01 12:18:09 37 4
gpt4 key购买 nike

我有这个 API,它要求我发送一个特定的数组键。由于该数组需要在所有类方法上使用,因此我正在考虑将其作为类属性。

abstract class something {
protected $_conexion;
protected $_myArray = array();
}

稍后,在这个类的方法上,我将使用:

$this->_myArray["action"] = "somestring";

(其中“action”是需要发送到此 API 的 key );

这样可以吗?我眼前的 OOP 还不够多,这就是我问这个问题的原因。

根据要求,这里是关于 API 的更多信息:

class Apiconnect {
const URL = 'https://someurl.com/api.php';
const USERNAME = 'user';
const PASSWORD = 'pass';

/**
*
* @param <array> $postFields
* @return SimpleXMLElement
* @desc this connects but also sends and retrieves the information returned in XML
*/
public function Apiconnect($postFields)
{
$postFields["username"] = self::USERNAME;
$postFields["password"] = md5(self::PASSWORD);
$postFields["responsetype"] = 'xml';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, self::URL);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
$data = curl_exec($ch);
curl_close($ch);

$data = utf8_encode($data);
$xml = new SimpleXMLElement($data);

if($xml->result == "success")
{
return $xml;
}
else
{
return $xml->message;
}
}

}


abstract class ApiSomething
{
protected $_connection;
protected $_postFields = array();

/**
* @desc - Composition.
*/
public function __construct()
{
require_once("apiconnect.php");

$this->_connection = new Apiconnect($this->_postFields);
}

public function getPaymentMethods()
{
//this is the necessary field that needs to be send. Containing the action that the API should perform.
$this->_postFields["action"] = "dosomething";

//not sure what to code here;

if($apiReply->result == "success")
{
//works the returned XML
foreach ($apiReply->paymentmethods->paymentmethod as $method)
{
$method['module'][] = $method->module;
$method['nome'][] = $method->displayname;
}

return $method;
}
}
}

非常感谢,内存

最佳答案

理论

首先,介绍一下背景。对象由“状态”(字段——在 PHP 中,这些通常称为“属性”,但我将以另一种方式使用该术语)和“行为”(方法)组成。状态是重要的组成部分encapsulation :只要对象存在,它就允许数据持久存在,并让数据在多个函数中可见。当您需要数据具有这两个属性时,您可以使用对象字段。这些属性是两个非常重要的属性的示例:可访问性(类似于 variable scope )和存储持续时间。讨论通常涵盖变量的范围和持续时间(将名称与数据相关联),但在这里我们将重点关注数据。

可访问性决定了何时何地可以通过代码访问数据。其他类型的可访问性包括本地(其中数据只能在单个函数内访问)和全局(其中每个函数调用中代码单元中的所有代码都可以访问数据)。与全局数据一样,state 可以被多个函数访问,但与全局数据不同的是,同一个方法在不同的对象上调用时会访问不同的数据。在某种程度上混淆了变量和数据的虚构语言示例:

i=0
inc() {...}
dec() {...}
class C {
i=0
inc() {...}
dec() {...}
}


a = C()
b = C()

inc() // the global i is visible in both these calls,
dec() // which access the same data

a.inc() // C::i is visible in both C::inc and C::dec,
b.dec() // but these calls access different data

i // The global i is accessible here
// C::i not accessible

存储持续时间决定了数据存在的时间(创建和销毁数据的时间)。持续时间类型包括 automatic (数据存在的地方,直到创建它的函数退出),static (数据在进程的生命周期内存在)和 dynamic (数据是显式创建的,并且在不再可访问时被垃圾收集器显式销毁或销毁)。状态与其对象共享持续时间:如果对象是自动的,则状态是自动的;如果是动态的,则状态是动态的。

State 并不是在方法调用之间访问数据的唯一方式。您还可以将数据作为参数传递给方法,在这种情况下,数据具有本地持续时间。 to 之间的区别在于,对于状态,“between”包括没有调用任何方法的时间(即在 call stack 上),而后者则没有。是否使用状态或参数取决于所需的持续时间类型。对于公共(public)方法,参数太多会降低可读性并可能导致错误(使用高 arity 的函数,更容易弄错顺序,或者完全忘记一个参数)。作为次要考虑因素,状态有助于减少参数数量。

申请

从您目前所展示的内容来看,您所询问的数据不需要在方法之间可访问,也不需要存在于每个方法调用之外。您询问的帖子字段基本上是 remote procedure call 的参数(远程过程调用);如果您允许通过调用方法来构建这些参数,那么将数据存储为对象状态是有意义的。事实上,将帖子字段存储为状态是有效的,但不是最佳实践。这也不一定是最糟糕的做法。最好的情况是,当数据不在使用 API 的方法中时,您会将对象弄得一团糟并浪费内存。最坏的情况是,您在一个方法中设置参数,然后在调用另一个方法时在 RPC 中传递这些参数。

abstract class ApiSomething {
public function eatSaltyPork() {
$this->_postFields["action"] = __FUNCTION__;
$this->_postFields['spices[]'] = 'salt';
$result = $this->_connection->Apiconnect($this->_postFields);
...
}
public function eachCheese() {
$this->_postFields["action"] = __FUNCTION__;
$result = $this->_connection->Apiconnect($this->_postFields);
...
}
}


$thing = new ApiSomething();
$thing->eatSaltyPork();
$thing->eatCheese(); // ends up eating salty cheese

这是您非常想避免的事情。这可以通过将帖子字段数组设置为空数组来轻松完成,但此时您最好使用局部变量而不是字段。

关于php - 数组作为类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3941859/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com