【问题标题】:Objects and properties对象和属性
【发布时间】:2015-03-14 19:42:18
【问题描述】:

这是作业。我必须说说明不是很清楚,但这就是我“破译”的内容。 我必须在不同的文件中创建 1 个具有 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;    
}   
}
?>

我必须创建一个具有 $model,$preu,$disc_dur,$ram 属性的“ordinador”对象,以便稍后显示。此信息来自一个 HTML 表单,该表单通过 $_POST 将其发送到名为“ordinadors.php”的文件中。由于我将拥有超过 1 个对象,因此我希望对象名称是一个变量。该名称将是单词“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 个“ordinadors”的信息):

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”:我插入 ordinador 信息。按钮“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 开始。我阅读了您发送的链接,但我认为我在这里错过了重点:-(

非常感谢您的帮助。

【问题讨论】:

  • 函数consultarOrdinadorO 不知道$$name,因为后者在外部范围内。而不是将对象存储为$$name,而是将它们放在一个数组中。
  • @ u_mulder 对不起,你说“而不是将对象存储为 $$name 而是将它们放在一个数组中。”是什么意思?
  • 可能不是最好的方法,因为我需要保留信息,因为我导航到其他页面,所以我将数组与对象一起存储在 $_SESSION 数组中。

标签: php class object properties


【解决方案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

【讨论】:

  • 感谢 u_mulder,我已经包含了一个更新,因为我认为我开始看到曙光了,但我现在还有一些其他问题(我担心与范围有关)。
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2012-04-04
相关资源
最近更新 更多