2012-11-16 43 views
7

Im bắt đầu di chuyển ra khỏi việc sử dụng mảng trong PHP vì các đối tượng có nhiều khoảng trống và trong php 5 không có lần truy cập hiệu suất khi sử dụng các đối tượng.Viết PHP đối tượng nội tuyến

Hiện nay cách tôi làm điều đó là:

$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));

Tuy nhiên, tôi thấy nó rất tẻ nhạt phải định kiểu mỗi lần như typecasting isnt đệ quy ...

Có cách nào trong php (hoặc sẽ có) để làm như thế này hoặc một cái gì đó tương tự:

$object = { 
    'this' => 'that', 
    'foo' => { 
     'bar' => 123 
    } 
}; 
+5

Tại sao bạn muốn sử dụng một đối tượng khi bạn tạo nó như một mảng anyways? – Peon

+0

Tôi không thể hiểu nhu cầu của bạn để truyền theo cách đó. – NappingRabbit

+1

bạn có thể nâng cấp lên php 5.4 và sử dụng cú pháp mảng ngắn; điều đó sẽ làm cho trình duyệt mã của bạn. Tôi với @DainisAbols mặc dù; Tôi không chắc chắn những gì bạn đang cố gắng để đạt được với các loại đúc anyway. Bạn thấy lợi thế gì khi sử dụng các đối tượng trên các mảng trong ngữ cảnh này? – SDC

Trả lời

4

Tôi khuyên bạn nên xây dựng một chiều rộng chức năng StdClass.

function arrayToObject($array) { 
    if(!is_array($array)) { 
     return $array; 
    } 

    $object = new stdClass(); 
    if (is_array($array) && count($array) > 0) { 
     foreach ($array as $name=>$value) { 
     $name = strtolower(trim($name)); 
     if (!empty($name)) { 
      $object->$name = arrayToObject($value); 
     } 
     } 
     return $object; 
    } 
    else { 
     return FALSE; 
    } 
} 
0

Rất tiếc, không có cú pháp nào tạo ra stdClass trường hợp như thế. Nhưng bạn có thể sử dụng các từ khóa new và bất kỳ các lớp học spl (không nhiều tidier tôi thừa nhận). Nếu bạn muốn tối ưu hóa cho các tổ hợp phím, bạn có thể viết một hàm helper ít như thế này:

function O($a){ 
    return new ArrayObject($a); // has -> and [] support too 
} 

và viết

$stuff = O(array('a' => 'tickle me elmo', 'b' => O(array('foo' => 'bar')))); 
0

Mặc dù tôi thật sự không thể hiểu tại sao bạn muốn làm điều này (mảng kết hợp là trong bản chất dữ liệu chỉ-đối tượng) nhưng nếu bạn cứ khăng khăng:
Thay vì đúc mỗi mảng duy nhất, trên mọi cấp độ duy nhất để một đối tượng, bạn có thể sử dụng "lừa/hack" sau:

$object = json_decode(
       json_encode(
        array('some'=>array('multi'=>'Dimensional'), 
         'array'=>'that', 
         'you' => array('want' => 'to', 
             'turn' => 'into'), 
         'an' => 'object'))); 

Điều này chuyển đổi tất cả các mảng thành các phiên bản của stdClass, mà tôi tin là những gì bạn muốn.
Một lần nữa, tôi phải nói: PHP là không phải là JavaScript và các đối tượng đắt hơn (tương đối nói) bằng các ngôn ngữ như PHP, sau đó chúng ở dạng JS. Tôi khuyên bạn nên gắn bó với việc sử dụng các mảng assoc nếu bạn không cần một đối tượng.

Giống như đối tượng, mảng có thể kiểu gợi ý: function foo (array $argument){}
Nếu bạn thực sự muốn biến chúng thành một trường hợp đặc biệt của một số lớp, tại sao không thay đổi constructor, để đối phó với một mảng:

class My_Object extends stdClass 
{ 
    public function __construct(array $params = null) 
    { 
     if (!empty($params)) 
     { 
      foreach ($params as $name => $value) 
      { 
       $this->{$name} = $value;//set everything 
      } 
     } 
    } 
} 

Và tiếp tục thêm bất cứ điều gì phương pháp bạn muốn thêm vào lô

2

PHP hiện không hỗ trợ cú pháp đối tượng ngắn. Kể từ PHP 5.4, chúng hỗ trợ cú pháp mảng ngắn. Có lẽ 5,5 sẽ bao gồm những gì bạn đang sau.

Là một thay thế:

Bạn có thể phác thảo đối tượng của bạn như JSON và sử dụng json_decode():

$json = '{"this": "that", "foo": {"bar": 123}}'; 
var_dump(json_decode($json)); 

Lưu ý: Tôi chỉ hiển thị này là minh chứng cho một cách để giải quyết câu hỏi của bạn. Tôi không ủng hộ một thực hành như vậy.

+1

mã đúng sẽ là $ json = '{"this": "that", "foo": {"bar": 123}}'; –

+0

Cảm ơn. Hỗn hợp một cú pháp mảng nhỏ trong đó :) –

+0

câu trả lời hay, tôi sẽ thay đổi nó thành một tham chiếu như <<< JSON JSON; chỉ để tránh báo giá địa ngục –

16

Bắt đầu từ PHP 5.4 cú pháp mảng ngắn đã có sẵn. Điều này cho phép bạn khởi tạo mảng như sau:

$myArray = ["propertyA" => 1, "propertyB" => 2]; 

Hiện không có cú pháp đối tượng ngắn nào trong PHP theo PHP7. Nhưng bạn có thể cast cú pháp mảng ngắn để tạo các đối tượng như thế này:

$myObject = (object) ["propertyA" => 1, "propertyB" => 2]; 

Trông rất đẹp và ngắn hơn so với sử dụng các cấu trúc sau:

$myObject = new \StdClass(); 
$myObject->propertyA = 1; 
$myObject->propertyB = 2; 
0

Tôi có một giải pháp thay thế cho khi bạn nhận được đã được xây dựng mảng. Giả sử mảng của bạn có n mảng lồng nhau, do đó bạn không có khả năng truyền từng mảng một cách đơn giản. này sẽ làm các trick:

$object = json_decode(json_encode($unknownArray)); 

tôi sẽ không sử dụng này trong một vòng lặp lớn hoặc một cái gì đó tương tự, vì nó là cách chậm hơn so với chỉ gắn bó với sintax mảng và sống với nó. Ngoài ra, nếu một phần tử của mảng là một hàm hoặc một số điều thú vị khác thì điều này sẽ phá vỡ điều đó.

Ví dụ sử dụng:

$unknownArray = array(
    'a' => '1', 
    'b' => '2', 
    'c' => '3', 
    'd' => array(
     'x' => '7', 
     'y' => '8', 
     'z' => '9', 
    ), 
); 
$object = json_decode(json_encode($unknownArray)); 
echo $object->d->x; 
Các vấn đề liên quan