数组作为类属性?

问题描述:

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

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

后来,这一类的方法,我会再使用:

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

(其中“动作”是需要被发送给该API的关键);

可以吗?我眼前没有看到足够的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; 
     } 
    } 
} 

非常感谢, MEM

+0

嗯,我不知道为什么你需要这个数组键是存在但肯定,看起来对我来说很好 – Hannes 2010-10-15 11:45:45

+0

有没有足够的信息来说'$ _myArray'属性是否是正确的。存储在其中的数据是否需要在“某些”方法调用中持续存在?告诉我们更多关于你使用的API的信息。 – outis 2010-10-15 11:51:08

+0

@outis - 不确定持续的部分。该属性用于所有方法,但该属性的值直到现在至少似乎不会将方法传递给另一个方法(即相同的值)。 (这是你要求什么?) – MEM 2010-10-15 11:54:29

理论

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

辅助功能确定数据何时何地可以通过代码访问。其他类型的可访问性包括本地(数据只能在单个函数内访问)和全局(在每个函数调用中数据可以被代码单元中的所有代码访问)。像全局数据一样,状态可以被多个函数访问,但与全局数据不同,同一个方法在不同对象上调用时会访问不同的数据。在一个由语言的一个例子是有点混淆变量&数据:

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(数据是明确创建的,并且在没有数据时被垃圾收集器明确销毁或销毁更长的访问)。状态共享持续时间与其对象:如果对象是自动的,则状态是自动的;如果动态,状态是动态的。

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

应用

从到目前为止,你已经证明什么,你问有关数据并不需要是方法之间的访问,并不需要每个方法调用之外存在。您询问的帖子字段基本上是remote procedure call(RPC)的参数;如果您允许通过调用方法来构建这些参数,那么将数据存储为对象状态是有意义的。事实上,将帖子字段存储为状态是有效的,但不是最佳实践。这也不一定是最坏的做法。最好的情况是,当不在使用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 

这是非常想要避免的事情。通过将post字段数组设置为一个空数组可以很容易地完成,但此时您可能会使用局部变量而不是字段。