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)
这是作业。我必须说说明不是很清楚,但这就是我的"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)