我需要一些外界的帮助,以便弄明白我是否会理解如何做到这一点......
我有一个多维数组,我正在尝试设置一个类,因此我可以将它用作对象,以便我可以动态调用它的一部分。
这是我的阵列的一小部分片段,因此您可以看到我正在使用的结构。
<?php $modelMap=array(
'RM3H3FEW' => array('year' => 2015,
'model' => 'CR-V',
'trim_level'=>array('LX','lx2wd'),
'transmission' => '2WD Continuously Variable ',
'colors' => array(
'BK' => 'Crystal Black Pearl',
'BL' => 'Obsidian Blue Pearl',
'CS' => 'Copper Sunset Pearl',
'KC' => 'Kona Coffee Metallic',
'MA' => 'Mountain Air Metallic',
'MS' => 'Modern Steel Metallic',
'RE' => 'Basque Red Pearl II',
'SI' => 'Alabaster Silver Metallic',
'UT' => 'Urban Titanium Metallic',
'WH' => 'White Diamond Pearl',
)
),
'RM4H3FEW' => array('year' => 2015,
'model' => 'CR-V',
'trim_level'=>array('LX','lxawd'),
'transmission' => 'AWD Continuously Variable ',
'colors' => array(
'BK' => 'Crystal Black Pearl',
'BL' => 'Obsidian Blue Pearl',
'CS' => 'Copper Sunset Pearl',
'KC' => 'Kona Coffee Metallic',
'MA' => 'Mountain Air Metallic',
'MS' => 'Modern Steel Metallic',
'RE' => 'Basque Red Pearl II',
'SI' => 'Alabaster Silver Metallic',
'UT' => 'Urban Titanium Metallic',
'WH' => 'White Diamond Pearl',
)
);
?>
这里是I级尝试构建以使其成为对象。毋庸置疑,我还没有走得太远......
<?php
class OptionsBuild
{
public $year = 0;
public $model = '';
public $transmission = '';
public $trimlevel = '';
public $colorID = '';
public $colorName = '';
public function __construct($modelMap)
{
$this->transmission = $transmission;
$this->trimlevel = $trimlevel;
$this->colorID = $colorID;
$this->colorName = $colorName;
}
}
//Test area
$obj = new OptionsBuild;
$obj = __construct($modelMap);
?>
每当我尝试创建一个可以执行任何操作的函数时,我总是会收到错误,告诉我我的函数不存在并且表现得像它不存在。这是为什么?
总结一下,我只是想设置一个允许我进入多维数组的类,然后进行设置,以便我可以添加函数/方法来获得年份,模型,修剪级别,传输和颜色。这甚至可能吗?如果这是一个简单的解决方案,请小心,我是PHP的新手,对编程不熟悉,我正在尝试创建我的第一个对象/类。
答案 0 :(得分:1)
构造是magic method,当您创建新类时会自动调用它
删除对__construct的调用并在新调用中传递$ modelMap
$obj = new OptionsBuild($modelMap);
其次我不知道你要对你的对象做什么,但是你想为数组中的每个键创建几个对象吗?例如RM4H3FEW是RM3H3FEW的单独物体吗?
如果是这种情况,您将在循环中创建它们,例如
foreach ($modelMap as $model) {
$obj = new OptionsBuild($model);
}
让我知道预期用途,我可以提供更多帮助...
答案 1 :(得分:1)
您似乎想要使用复杂的数组和对象解决问题,而对象的声音使用可能就是您想要的。您可以使用面向对象的原则很好地处理这个问题。多维数组很麻烦,通常难以跟踪和使用。使用对象通常是摆脱它们的好方法。
此外,您遇到技术问题,因为您正在错误地访问变量。例如,您尚未创建“代码”字段,$ this-&gt;代码将引用该字段。 $ this指的是对象本身,以及 - &gt;之后的任何内容。是您要访问的对象的哪个部分。在您的情况下,$ this-&gt; year引用存储在表达式内部的OptionsBuild对象中的年份值。
考虑到这一点,这就是我如何构建您呈现给我们的代码,考虑到我想象您希望它如何工作。希望它有意义。
OptionsBuild对象的定义如下:
<?php
/**
* User: hjorthjort
* Date: 15-06-21
* Time: 02:40
*/
class OptionsBuild {
public $year = 0;
public $model = '';
public $transmission = '';
public $trimlevel = '';
public $colorID = '';
public $colorName = '';
private static $colors = array( //This will always be the same, so make it a static field.
'BK' => 'Crystal Black Pearl',
'BL' => 'Obsidian Blue Pearl',
'CS' => 'Copper Sunset Pearl',
'KC' => 'Kona Coffee Metallic',
'MA' => 'Mountain Air Metallic',
'MS' => 'Modern Steel Metallic',
'RE' => 'Basque Red Pearl II',
'SI' => 'Alabaster Silver Metallic',
'UT' => 'Urban Titanium Metallic',
'WH' => 'White Diamond Pearl',
);
public function __construct($modelMap)
{
$this->year = $modelMap['year'];
$this->model = $modelMap['model'];
$this->transmission = $modelMap['transmission'];
$this->trimlevel = $modelMap['trim_level'];
$this->colorID = $modelMap['colorID'];
$this->colorName = OptionsBuild::$colors[$this->colorID];
}
}
然后像这样制作modelMap-arrays:
<?php
/**
* User: hjorthjort
* Date: 15-06-21
* Time: 02:38
*/
$modelMap1 = array('year' => 2015,
'model' => 'CR-V',
'trim_level'=>array('LX','lx2wd'),
'transmission' => '2WD Continuously Variable ',
'colorID' => 'BK'
);
$modelMap2 = array('year' => 2015,
'model' => 'CR-V',
'trim_level'=>array('LX','lxawd'),
'transmission' => 'AWD Continuously Variable ',
'colorID' => 'CS'
);
include_once('OptionsBuild.php');
$obj1 = new OptionsBuild($modelMap1);
$obj2 = new OptionsBuild($modelMap2);
$objects = array('RM3H3FEW' => $obj1, 'RM4H3FEW' => $obj2);
print_r($objects); //To see what you have created thus far.
注意如何使用“new”关键字创建新的OptionsBuild,而不是通过调用__construct(即使使用“new”完全按照我想要的方式调用__construct)。
这是print_r的输出。 $ objects数组现在包含两个对象,由您在顶层使用的相同字符串标识。然后每个对象包含有关年份,传输等的信息。
Array
(
[RM3H3FEW] => OptionsBuild Object
(
[year] => 2015
[model] => CR-V
[transmission] => 2WD Continuously Variable
[trimlevel] => Array
(
[0] => LX
[1] => lx2wd
)
[colorID] => BK
[colorName] => Crystal Black Pearl
)
[RM4H3FEW] => OptionsBuild Object
(
[year] => 2015
[model] => CR-V
[transmission] => AWD Continuously Variable
[trimlevel] => Array
(
[0] => LX
[1] => lxawd
)
[colorID] => CS
[colorName] => Copper Sunset Pearl
)
)
还要注意上面如何访问数组 - 通过数组名称,尖括号[]和键的名称,如
$modelMap['transmission']
因此,要获取数组中的第一个对象RM3H3FEW及其属性,您需要编写
$variable = $objects['RM3H3FEW']; //Get the object
$variable = $objects['RM3H3FEW'][year]; //Get the year of the object
$variable = $objects['RM3H3FEW']['trimlevel'][1] //Get lx2wd (not sure what that is)
希望这有帮助。
答案 2 :(得分:1)
从您的代码中,我发现了3个问题。
__construct
不正确。使用New Object($argumentsForConstruct)
初始化对象时执行。尝试更改您的测试区域&#34;对此:
$models = Array()
foreach ($modelMap as $modelArray) {
$models[] = New OptionsBuild($modelMap)
}
循环遍历数组并附加到另一个数组解决了问题1,New
语法修复了问题3.对于问题2,将数组属性的初始值更改为Array()
而不是{{ 1}}。
最后,您需要将''
更新为__construct
,这将根据输入数组中的相应键设置属性。
$this->var = $array["var"]
希望这可以让你从数组转换为PHP OOP对象。
答案 3 :(得分:0)
行: $ obj = __construct($ modelMap);
错误,构造函数在创建对象时自我调用:
你的例子应该是谎言:
$obj = new OptionsBuild($modelMap);