2012-05-20 32 views
0

我試圖將現有的代碼庫轉換爲更正確的方法。我們現有的代碼庫是用HTML和HTML編寫的,PHP和Javascript代碼遍佈整個地方(不是以無序的方式插入,但不像它應該那樣)。訪問對象內數組元素的方法

因此,我將當前的代碼庫轉換爲使用類,因此屬性和方法是繼續進行的方式。但我有一個問題。我(理想情況下)想通過他們的名字而不是索引來引用我的一個班級成員。讓我把它放在一個代碼示例中。

這是窗體類:

class form { 
    public $name; 
    public $fields; 

    {constructor goes here...} 

    public function addField($type, $name, $hint = null, $info = null) { 
     $this->fields[] = new field($type, $name, $hint, $info); 
    } 
} 

這是該領域類(創建一個新的表單字段,當窗體類調用):

class field { 
    public $name; 
    public $type; 
    public $values; 

    public function __construct($name) { 
     $this->name = $name; 
     $this->fields = null; 
    } 

    public function addValue($value, $minimum = null, $maximum = null, $step = 1) { 
     $this->values[] = new value($value, $minimum, $maximum, $step); 
    } 
} 

所以我的代碼看起來像這個:

$form = new form("form1"); 
$form->addField(NUMBER, "number1"); 
$form->fields[0]->addValue(25, 1, 250, 1); 

它實際上有效,但它不是我想要的。我想通過其指定的名字來稱呼每個字段,所以我可以寫這個:

$form = new form("form1"); 
$form->addField(NUMBER, "number1"); 
$form->fields['number1']->addValue(25, 1, 250, 1); 

甚至:

$form->addField(NUMBER, "number1")->addValue(25, 1, 250, 1); 

這可能嗎?

+1

不要問是否可能,只要嘗試一下。 –

+1

當然是這樣的:'$ this-> fields [$ name] = new field($ type,$ name,$ hint,$ info);' – nullpotent

+2

這是我用自己的血液和汗水學習的東西:**永遠不要寫一個表單生成器**。它永遠不會變好..還有,**你的抽象在各處泄漏**! –

回答

2

它看起來像字段只是表單對象內的一個數組。所以,而不是

$this->fields[] = new field($type, $name, $hint, $info); 

你可以這樣做嗎?

$this->fields[$name] = new field($type, $name, $hint, $info); 
+0

就像我告訴** AljoshaBre **,這是一個很好的答案,雖然我的問題是我需要兩個索引,因爲我正在尋找的是引用數組成員的快速方法。我總是可以執行'echo $ form-> fields [27] - > values [0] - > value',但我更喜歡更簡單的方法:) –

+1

您是否在說要按字段訪問數組名稱和數字索引?一種方法是'array_keys($ form-> fields)',它給你一個數字索引的字段名稱數組。然後你可以遍歷該列表。 – octern

+0

是的,因爲我正在像狀態機一樣構建頁面渲染器。我的頁面類中的render()方法使用for循環遍歷所有頁面元素,並根據要分析的元素應用一些條件。這就是爲什麼我想保留索引,但同時,有一個快速找到字段的方法。我發現了一個臨時解決方案(我不知道它在多用戶環境中如何工作),它正在執行'define($ name,count($ this-> fields) - 1);'創建一個常量用字段名稱和新創建字段的索引定義。工程,但仍然...嗯 –