簡體   English   中英

php將數組傳遞並循環到類方法中

[英]php passing and looping an array into a class method

我是php類的新手,如果這很明顯的話,我們深表歉意。 我正在嘗試將數組傳遞給類方法,但是當我嘗試foreach循環時收到警告

警告:為foreach()提供了無效的參數。

foreach實際上確實循環了數組並給了我想要的結果,所以我對警告感到困惑,而且我沒有找到關於如何解決它/以正確方式進行操作的任何簡單解釋。 我還嘗試將數組作為json_encode傳遞,然后在方法內部解碼回數組,並且發生相同的警告。 還有什么讓我感到困惑,如果我在方法內部使用print_r($ this-> payload),我什么也不會得到。

這是我的課...

// class
// --------------------------
class Form {

public $form_action;
public $form_method;
public $form_class;
public $form_role;
public $payload;

    function form() {

        $output = '';

        foreach ($this->payload as $key => $value) {
            $output .= '<input type="'.$key.'" name="'.$key.'" ......>';
        }

        return $output;

    }

}

這是數組...

// array
// --------------------------
$my_array = (object)array (

"form1"  => (object)array ( 
      "foo1"    => "bar1", 
      "foo2"    => "bar2"
   )

);

這是我將數組傳遞給類的地方...

// set class
// --------------------------
$set = new Form;
$set->form_action   = '';
$set->form_method   = 'post';
$set->form_class    = 'form-signin';
$set->form_role     = 'form';
$set->payload       = $my_array->form1;

echo $set->form();

數組中沒有option1 (實際上是對象)。 無論如何,當它是一個對象時,為什么還要稱它為數組呢? 這樣就是$my_array->form1

並且您使用與函數名稱相同的名稱來顯示表單,就像類的名稱一樣,因此將成為構造函數。 第一次運行時, $this->payload將沒有任何價值。

因此,您的最終代碼將如下所示:

class Form {

    public $form_action;
    public $form_method;
    public $form_class;
    public $form_role;
    public $payload;

    function showForm() {
        $output = '';
        foreach ($this->payload as $key => $value) {
            $output .= '<input type="' . $key . '" name="' . $key . '" ......>';
        }
        return $output;
    }

}

$my_array = (object) array(
        "form1" => (object) array(
            "foo1" => "bar1",
            "foo2" => "bar2"
        )
);
$set = new Form;
$set->form_action = '';
$set->form_method = 'post';
$set->form_class = 'form-signin';
$set->form_role = 'form';
$set->payload = $my_array->form1;
echo $set->showForm();

從您的警告消息中我無法分辨。 但是我認為,如果您要查看堆棧跟蹤,該警告是通過$set = new Form;這一行生成的$set = new Form;

從有關構造函數的php手冊中

為了向后兼容,如果PHP 5找不到給定類的__construct()函數,並且該類未從父類繼承一個__construct()函數,它將按該類的名稱搜索舊式構造函數。 實際上,這意味着唯一有兼容性問題的情況是該類具有名為__construct()的方法,該方法用於不同的語義。

因為在示例類中,您的方法與該類共享相同的名稱,並且沒有__construct方法。 當您創建$this->payload為空的對象時,將調用form()方法。

您可以通過創建__construct方法或在類定義中將$this->payload初始化$this->payload空數組來解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM