2012-09-13 35 views
21

Trong mã sau, $quiz_object->personalities chứa một mảng các đối tượng Personality.Biến đúc PHP dưới dạng loại đối tượng trong foreach Vòng

// Loop through each personality that exists for the quiz 
foreach($quiz_object->personalities AS $existing_personality) 
{ 

    // Show all of the existing personalities 
    echo $existing_personality->GetQuizMakerPersonalityHTML(); 
} 

Làm thế nào để "đúc" (Tôi nghĩ rằng đó là từ bên phải) biến $existing_personality trong vòng lặp foreach tôi như các loại đối tượng?

Tôi muốn thực hiện việc này để khi nhập $existing_personality->, tôi nhận danh sách các chức năng công khai có sẵn cho loại đối tượng đó.

CẬP NHẬT

Tại thời điểm này, Zend Studio không biết tôi đang lặp thông qua một loạt các Personality đối tượng trong các vòng lặp, nó chỉ nghĩ đó là một biến chuẩn. Tuy nhiên, nó là một loại và mã của tôi hoạt động hoàn toàn tốt. Tôi chỉ muốn các gợi ý IDE trên biến của tôi trong vòng lặp foreach.

Chỉ vì vậy mà tôi đang rõ ràng, các gợi ý xuất hiện cho mọi đối tượng khác, nếu tôi có:

$personality_object = new Personality(); 

// I get the IDE hints here 
echo $personality_object->MyFunction(); 

Nhưng ngay sau khi tôi bắt đầu vòng lặp trong một foreach, Zend không có cách nào để biết rằng tôi 'm lặp qua một mảng các đối tượng.

Đây là cách các mảng của nhân vật được xác định ban đầu trong vòng Personality đối tượng của tôi:

class Personality 
{ 

    // Array of Personality objects 
    public $personalities = array(); 

} 
+1

Bạn chỉ đang nói về việc bật gợi ý IDE? – deceze

+0

Bạn có gặp lỗi không? – jurgemaister

+0

Tôi nhận được các gợi ý cho mọi đối tượng khác, nhưng không phải là gợi ý mà tôi có trong vòng lặp foreach. – Luke

Trả lời

45

Nó phụ thuộc nhiều vào IDE bạn đang sử dụng.

Trong Netbeans và IntelliJ bạn có thể sử dụng @var trong một chú thích:

/* @var $variable ClassName */ 
$variable-> 

Các IDE bây giờ sẽ biết rằng biến $ là của ClassName lớp và gợi ý sau ->.

Bạn cũng có thể dùng thử trong IDE của riêng mình.

Bạn cũng có thể tạo ra một chú thích @return trong một phương pháp getPersonalities() nói rằng sự trở lại sẽ là một ClassName[], có nghĩa là một mảng của các đối tượng ClassName:

/** 
* Returns a list of Personality objects 
* @return Personality[] 
*/ 
function getPersonalities() { 
    return $this->personalities; 
} 

này cũng phụ thuộc vào cách IDE của bạn được giải thích kiểu này gợi ý.

Để sử dụng này trong foreach loops bạn có thể làm 1:

/* @var $existing_personality Personality */ 
foreach($quiz_object->personalities as $existing_personality){ 
} 

hoặc 2:

foreach($quiz_object->getPersonalities() as $existing_personality){ 
} 

cả nên cho phép IDE gián tiếp, nếu IDE của bạn là loại đủ.

Là một lưu ý thêm, nếu bạn muốn sử dụng này bên trong lớp riêng của nó, bạn có thể sử dụng cùng một chữ ký khi khai báo một biến lớp:

class MyClass 
{ 

    /** 
    * @var ClassName[] $variable List of ClassName objects. 
    */ 
    var $variable; 

} 
+1

Tuyệt vời, '/ * @var $ existing_personality Cá tính */'hoạt động! Tôi đang sử dụng IDE trong Zend Studio theo mặc định. – Luke

+0

Thật tuyệt khi nghe. Hãy vui vẻ với nó. – Krycke

+0

hoàn hảo cảm ơn bạn –

-1

PHP không phải là một ngôn ngữ đánh mạnh như C#

này là hoàn toàn Allright trong PHP

$i = 0; 
$i = 'Hello World'; 
echo $i; 

Có khả năng biến 'truyền' như sau:

$i = '12.3'; 
echo (int)$i; 

Đối với các đối tượng, không có xây dựng trong phương pháp để 'đúc'

+0

Cảm ơn bạn đã trả lời, tuy nhiên tôi nghĩ bạn đã hiểu nhầm vấn đề của tôi. Vui lòng xem bản cập nhật, tôi đã cố làm rõ vấn đề của mình. Nó cung cấp các gợi ý IDE, nhưng không chỉ cho vòng lặp foreach, bởi vì Zend Studio không biết từ mã của tôi rằng nó là một mảng các đối tượng. – Luke

7

chỉ nghĩ rằng tôi muốn ném này trong đó đối với những sử dụng phpStorm.

Tôi tìm thấy cách để có được IDE tự động điền các phương thức cho một đối tượng bằng cách bao gồm nhanh chóng nếu kiểm tra trước khi kiểm tra xem đối tượng có tồn tại không và $ var là một thể hiện của đối tượng đã nói.

Ví dụ:

  foreach ($objArray as $obj) { 
      if (is_object($obj) && $obj instanceof DataObject) { 

       $obj->thisMethodShouldBeAvailableInPHPStormNow(); 

      } 

Tìm thấy câu hỏi này trong khi tìm kiếm một cách tốt hơn, nhưng các công trình trên đối với tôi.

Chúc mừng!

3

Bạn luôn có thể gọi ra một hàm riêng biệt từ bên trong foreach và khai báo lớp trong khai báo hàm. Điều này cũng có thể có lợi ích cho phép bạn sử dụng lại mã này ở nơi khác. Ví dụ bên trong hàm getPriceFromProduct bên dưới, bạn sẽ thấy cách tôi khai báo lớp $ product thành Product.

Tất nhiên tôi đồng ý sẽ không tốt nếu không phải làm theo cách này nhưng hey, nó hoạt động.

class ProductBundle { 

    private $products; //buy this 
    public function get_products() { return $this->products; } 
    public function add_product($product) { $this->products[] = $product; } 

    public function get_price() { 
     $products = $this->get_products(); 
     $prices = array(); 
     foreach($products as $product) { 
      $prices[] = $this->getPriceFromProduct($product); 
     } 
     return array_sum($prices); 
    } 

    private function getPriceFromProduct(Product $product) { 
     $price = $product->get_price(); 
     return $price; 
    } 
3

Tôi biết bài này là cũ nhưng tôi nghĩ rằng điều này có thể giúp ai đó:

Trong PhpStorm hoạt động theo cách này, có lẽ những người khác quá.

/** 
* @param ClassName[] $variables 
*/ 
public function loopFunction($variables){ 
    foreach ($variables as $variable) { 
     echo $variable->functionName(); 
    } 
} 
Các vấn đề liên quan