对象和属性

时间:2015-03-14 19:42:18

标签: php class object properties

这是作业。我必须说说明书不是很清楚,但这就是我“破译”的内容。 我必须在不同的文件中创建1个带有“子类”的类。父类是:

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

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

“子类”是:

<?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”对象,其属性为$ model,$ preu,$ disc_dur,$ ram以便稍后显示。此信息来自HTML表单,该表单通过$ _POST将其发送到名为“ordinadors.php”的文件。由于我将拥有多个对象,因此我希望对象名称是变量变量。名称将是“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" } 

创建对象后,我必须搜索特定的“模型”并返回与该模型相关的其他属性(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个“quadadors”的信息):

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

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

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

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

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

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

有什么帮助吗?我已经在论坛中寻找过这样的其他问题,但我没有找到任何问题。我想我可能不太了解对象和类是如何工作的,但老师提供的信息非常有限。

非常感谢!

更新1: 谢谢u_mulder,我想我现在看到了一些亮点。但是......我一直有一些问题: - (。

我之前错过的其他信息:我有一个带有2个按钮的HTML表单。 - 按钮“inserir”:我插入了quadador信息。按钮“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);

返回:

array(0) { }

我想这是因为它在这里阅读$ objetos,当然它是空的:

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

但是......我怎么做才能这样我也能从那里读出来?

抱歉,我刚开始使用php。我看了你发的链接,但我想我错过了这一点: - (

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

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

$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