2010-10-15 39 views
8

Tôi có API này yêu cầu tôi phải có một mã mảng cụ thể để gửi. Vì mảng đó cần phải được sử dụng trên tất cả các phương thức lớp, tôi đã nghĩ đến việc đặt làm thuộc tính lớp.Mảng là thuộc tính lớp học?

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

Sau đó, về các phương pháp của lớp này, tôi sẽ sử dụng:

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

(Trong trường hợp "hành động" là chìa khóa mà cần phải được gửi đến API này);

Điều này có được không? Tôi đã không nhìn thấy đủ OOP trước mắt tôi đó là lý do tại sao tôi hỏi điều này.

Theo yêu cầu, đây là thông tin thêm về 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; 
     } 
    } 
} 

Thanks a lot, MEM

+0

Vâng, tôi không biết chính xác lý do tại sao bạn cần khóa mảng này tồn tại nhưng chắc chắn, trông hoàn toàn ổn với tôi – Hannes

+0

Không có đủ thông tin để nói rằng thuộc tính '$ _myArray' là điều đúng đắn cần làm. Dữ liệu được lưu trữ trong nó có cần phải tồn tại trên phương thức 'something' gọi không? Hãy cho chúng tôi biết thêm về API bạn đang sử dụng. – outis

+0

@outis - Không chắc chắn về phần còn lại. Thuộc tính đó được sử dụng trên tất cả các phương thức, nhưng các giá trị của thuộc tính đó, cho đến bây giờ ít nhất, dường như không truyền (cùng giá trị đó) từ phương thức này sang phương thức khác. (Đây là những gì bạn yêu cầu?) – MEM

Trả lời

7

Theory

Thứ nhất, một chút của nền. Các đối tượng bao gồm "trạng thái" (các trường-trong PHP, chúng thường được gọi là "các thuộc tính", nhưng tôi sẽ sử dụng thuật ngữ đó theo cách khác) và "hành vi" (các phương thức). Nhà nước là một phần quan trọng của encapsulation: nó cho phép dữ liệu tồn tại miễn là một đối tượng tồn tại và cho phép dữ liệu được hiển thị trong nhiều chức năng. Bạn sử dụng các trường đối tượng khi bạn cần dữ liệu để có hai thuộc tính này. Các thuộc tính này là ví dụ về hai thuộc tính rất quan trọng: khả năng truy cập (tương tự như variable scope) và thời lượng lưu trữ. Các cuộc thảo luận thường bao gồm phạm vi và thời lượng của các biến (liên kết tên với dữ liệu), nhưng ở đây chúng tôi sẽ tập trung vào dữ liệu.

Trợ năng xác định thời gian và vị trí dữ liệu có thể được, tốt, được truy cập bằng mã. Các loại khả năng truy cập khác bao gồm cục bộ (nơi dữ liệu chỉ có thể truy cập trong một hàm duy nhất) và toàn cục (nơi dữ liệu có thể truy cập được tới tất cả mã trong một đơn vị mã trong mọi cuộc gọi hàm). Giống như dữ liệu toàn cục, trạng thái có thể truy cập được tới nhiều hàm, nhưng không giống như dữ liệu chung, cùng một phương thức sẽ truy cập dữ liệu khác nhau khi được gọi trên các đối tượng khác nhau. Một ví dụ trong một ngôn ngữ tạo thành mà hơi bối rối biến & dữ liệu:

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 

thời gian lưu trữ xác định bao lâu các dữ liệu tồn tại (khi nó được tạo ra và phá hủy). Các loại thời lượng bao gồm automatic (nơi dữ liệu tồn tại cho đến khi chức năng tạo ra nó thoát), static (dữ liệu tồn tại trong suốt quá trình) và dynamic (dữ liệu được tạo rõ ràng và bị phá hủy hoặc phá hủy một cách rõ ràng bởi bộ thu gom rác khi không có còn có thể truy cập được). Nhà nước chia sẻ thời gian với đối tượng của nó: nếu đối tượng là tự động, trạng thái là tự động; nếu năng động, trạng thái là động.

Nhà nước không phải là cách duy nhất để có thể truy cập dữ liệu giữa các cuộc gọi phương thức. Bạn cũng có thể chuyển dữ liệu dưới dạng đối số cho các phương thức, trong trường hợp đó dữ liệu có thời lượng cục bộ. Sự khác biệt giữa giá trị là cho trạng thái, "giữa" bao gồm thời gian khi không có phương thức nào được gọi (tức là trên call stack), trong khi phương thức thứ hai thì không. Việc sử dụng trạng thái hoặc đối số có phụ thuộc vào loại thời lượng được yêu cầu hay không. Với phương pháp công khai, có quá nhiều đối số làm giảm khả năng đọc và có thể gây ra lỗi (với chức năng cao arity, dễ dàng hơn để có được thứ tự sai, hoặc quên hoàn toàn đối số). Khi xem xét thứ cấp, tiểu bang có thể giúp giảm số lượng đối số.

Application

Từ những gì bạn đã thể hiện cho đến nay, các dữ liệu bạn đang hỏi về không cần phải có thể truy cập giữa các phương pháp và không cần phải tồn tại bên ngoài của từng phương pháp gọi. Các trường bài bạn đang hỏi về cơ bản là các đối số cho một remote procedure call (RPC); Nếu bạn cho phép xây dựng các đối số này bằng cách gọi các phương thức, thì sẽ có ý nghĩa để lưu trữ dữ liệu dưới dạng trạng thái đối tượng. Vì vậy, việc lưu trữ các trường bài đăng là trạng thái hợp lệ, nhưng không phải là thực hành tốt nhất. Nó cũng không nhất thiết phải thực hành tồi tệ nhất. Trường hợp tốt nhất, bạn đang làm lộn xộn đối tượng và lãng phí bộ nhớ bằng cách giữ dữ liệu xung quanh khi không nằm trong một phương thức đang sử dụng API. Trường hợp xấu nhất, bạn đặt các đối số trong một phương thức mà sau đó được truyền vào RPC khi một phương thức khác được gọi.

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 

Đây là điều bạn muốn tránh. Nó có thể dễ dàng được thực hiện bằng cách thiết lập mảng mảng trường thành một mảng trống, nhưng tại thời điểm đó bạn cũng có thể sử dụng biến cục bộ thay vì một trường.

Các vấn đề liên quan