Objects 和属性

Objects and properties

这是作业。我必须说说明不是很清楚,但这就是我的"deciphered"。 我必须在不同的文件中创建 1 class 和 1 "subclass"。 Parent class 是:

<?php
class Objecte
{
var $model;
private $preu;

public function __construct($model,$preu)
{   
    $this->model=$model;
    $this->preu=$preu;  
}
}
?>

"subclass"是:

<?php
include('classe_objecte.php');
class Ordinador extends Objecte
{
private $disc_dur;
private $ram;

public function Ordinador($model,$preu,$disc_dur,$ram)
{
    parent::__construct($model,$preu);
    $this->disc_dur=$disc_dur;
    $this->ram=$ram;    
}   
}
?>

我必须创建一个 "ordinador" object 属性 $model,$preu,$disc_dur,$ram 以便稍后显示。此信息来自 HTML 表单,该表单通过 $_POST 将其发送到名为 "ordinadors.php" 的文件。因为我会有超过 1 个 object,所以我希望 object 名称是一个可变变量。该名称将是单词 "ordinador" 和一个名为 'numOrdinadorsO' 的会话变量中提供的数字。这是 "ordinadors.php" 代码的一部分:

include_once('classe_ordinador.php');
/*some other code here*/
$name="ordinador".$_SESSION['numOrdinadorsO'];
$$name=new Ordinador($model,$preu,$disc_dur,$ram);

如果我 var_dump($$name),我得到这个:

object(Ordinador)#1 (4) { ["disc_dur":"Ordinador":private]=> string(3) "100" ["ram":"Ordinador":private]=> string(1) "8" ["model"]=> string(7) "modelo1" ["preu":"Objecte":private]=> string(3) "200" } 

创建 object 后,我必须搜索特定的 "model" 和 return 与该模型相关的其他属性(preu、ram 等)。问题开始了。这是代码:

function consultarOrdinadorO()
{   
    $model_buscat=$_POST['ordinador_busqueda'];
    $valor=$_SESSION['numOrdinadorsO'];
    $contador=0;
    $trobat=false;
    do 
    {
        for ($i=0; $i<$valor; $i=$i+1)
        {
            $name="ordinador".$i;
            if ($$name->model==$model_buscat)  <-- this is line 91
            {
                echo "Model $model_buscat trobat.";
                $trobat=true;
                break;
            } else {
                $contador+=1;
            }
        }
    }
        while ($trobat==false && $contador<$valor);

    if ($trobat==false)
    {
        echo "Model $model_buscat no trobat.";
    }       
}

我得到这个错误(我之前插入了 3 "ordinadors" 的信息):

Notice: Undefined variable: ordinador0 in C:\Users\Quenya\IOC14-2015\S2\M09 PHP\EAC1\Ejercicios\Exercici2\ordinadors.php on line 91

Notice: Trying to get property of non-object in C:\Users\Quenya\IOC14-2015\S2\M09 PHP\EAC1\Ejercicios\Exercici2\ordinadors.php on line 91

Notice: Undefined variable: ordinador1 in C:\Users\Quenya\IOC14-2015\S2\M09 PHP\EAC1\Ejercicios\Exercici2\ordinadors.php on line 91

Notice: Trying to get property of non-object in C:\Users\Quenya\IOC14-2015\S2\M09 PHP\EAC1\Ejercicios\Exercici2\ordinadors.php on line 91

Notice: Undefined variable: ordinador2 in C:\Users\Quenya\IOC14-2015\S2\M09 PHP\EAC1\Ejercicios\Exercici2\ordinadors.php on line 91

Notice: Trying to get property of non-object in C:\Users\Quenya\IOC14-2015\S2\M09 PHP\EAC1\Ejercicios\Exercici2\ordinadors.php on line 91

有什么帮助吗?我在论坛中查看过类似的其他问题,但我没有找到任何问题。我想我可能不太了解 objects 和 classes 是如何工作的,但是老师提供的信息...非常有限。

非常感谢!

更新 1: 谢谢 u_mulder,我想我现在看到了一些曙光。但是...我总是遇到一些问题:-(.

我之前错过的其他信息:我有一个带有 2 个按钮的 HTML 表单。 - 按钮"inserir":我插入序数信息。按钮 "consultar":我在文本框中插入一个模型,然后单击该模型以搜索该模型。

ordinadors.php 中的代码,用于指定当我单击一个或另一个按钮时调用哪个函数:

session_start();
include_once('classe_ordinador.php');
$objetos=arrray();

//这里有一些其他代码

if (isset($_POST['inserir'])) 
{
    inserirOrdinador();
    inserirOrdinadorS();        
    inserirOrdinadorO();
    var_dump($objetos);
} elseif (isset($_GET['consultar'])=='consultar')
{
    consultarOrdinador();
} elseif (isset($_POST['consultar_ordinador']))
{   
    if (empty($_POST['ordinador_busqueda']))
    {
        echo "Model no introduit.";
    }else
    {

        var_dump($objetos);
        /*
        consultarOrdinadorS();
        consultarOrdinadorO($objetos);
        */
    }
}

inserirOrdinadorO 现在看起来像这样:

function inserirOrdinadorO()
{
      $_SESSION['ordinadorsO']=array('model_ordinadors'=>$_POST['model_ordinadors'],'preu_ordinadors'=>$_POST['preu_ordinadors'],'tamany'=>$_POST['tamany'],'ram'=>$_POST['ram']);

    $model=$_SESSION['ordinadorsO']['model_ordinadors'];
    $preu=$_SESSION['ordinadorsO']['preu_ordinadors'];
    $disc_dur=$_SESSION['ordinadorsO']['tamany'];
    $ram=$_SESSION['ordinadorsO']['ram'];

    global $objetos;
    $obj_id = $_SESSION['numOrdinadorsO'];
    $ord_tmp = new Ordinador($model,$preu,$disc_dur,$ram);
    $objetos[$obj_id] = $ord_tmp;

    $_SESSION['numOrdinadorsO']+=1;
    echo "Objecte Ordinador inserit.</br>";
} 

所以这里的 var_dump($objetos) 向我展示了我在 inserirOrdinadorO:

中添加的值
if (isset($_POST['inserir'])) 
{
    inserirOrdinador();
    inserirOrdinadorS();        
    inserirOrdinadorO();
    var_dump($objetos);

但是这里的

} elseif (isset($_POST['consultar_ordinador']))
{   
    if (empty($_POST['ordinador_busqueda']))
    {
        echo "Model no introduit.";
    }else
    {

        var_dump($objetos);

return是这个:

array(0) { }

我猜这是因为它正在读取 $objetos 这里当然是空的:

session_start();
include_once('classe_ordinador.php');
$objetos=array();

但是...我该如何制作它以便我也可以从那里读取它?

抱歉,我刚开始 php。我阅读了您发送的 link,但我认为我忽略了这里的要点:-(

非常感谢您的帮助。

首先,当你有一堆相似的对象并且你需要存储它们时——使用数组。 所以,当你有一些会话值时:

$obj_id = $_SESSION['numOrdinadorsO'];
// instead of using variable variables use arrays:
$objects = array();  // array to store your objects
$ord_tmp = new Ordinador($model,$preu,$disc_dur,$ram);
// Now you have all your objects of type Ordinador in an array
$objects[$obj_id] = $ord_tmp;

你的主要问题是函数作用域。当你调用 consultarOrdinadorO 时,这个函数在它自己的范围内工作,所以它不知道任何外部变量。 有两种解决方法:

在您当前的函数中,在您尝试访问 $$name 之前,您应该将其声明为 global,以便该函数知道该变量在其他地方定义:

for ($i=0; $i<$valor; $i=$i+1)
{
    $name="ordinador".$i;
    // add the following line
    global $$name;
    // other code is the same

或者您可以将变量作为参数传递。但在你的情况下,你不知道你有多少个对象。这就是我建议您使用数组的原因。将所有 Ordinators 排列后,您可以将函数定义为:

function consultarOrdinadorO($ordinators) 
{
    // code skipped
    for ($i=0; $i<$valor; $i=$i+1)
    {
        $cur_obj = $ordinators[$i];
        if ($cur_obj->model ==  )
    // code skipped
}

假设您早先将所有对象收集到 $objects 数组,函数调用将是 consultarOrdinadorO($objects)

更多关于函数的信息:http://ca1.php.net/language.functions.php