php - texto - string strip_tags
Error grave de PHP: no se puede acceder a la propiedad vacĂa (7)
Soy nuevo en php
y he ejecutado el código siguiente.
<?php
class my_class{
var $my_value = array();
function my_class ($value){
$this->my_value[] = $value;
}
function set_value ($value){
// Error occurred from here as Undefined variable: my_value
$this->$my_value = $value;
}
}
$a = new my_class (''a'');
$a->my_value[] = ''b'';
$a->set_value (''c'');
$a->my_class(''d'');
foreach ($a->my_value as &$value) {
echo $value;
}
?>
Tengo errores debajo ¿Cuál podría ser el error?
Notice: Undefined variable: my_value in C:/xampp/htdocs/MyTestPages/f.php on line 15
Fatal error: Cannot access empty property in C:/xampp/htdocs/MyTestPages/f.php on line 15
Como veo en su código, parece que está siguiendo una antigua documentación / tutorial sobre OOP en PHP basado en PHP4 (OOP no fue compatible, pero se adaptó de alguna manera para ser utilizado de una manera simple), desde PHP5 se agregó un soporte oficial y la notación ha cambiado de lo que era.
Por favor, consulte esta revisión del código aquí:
<?php
class my_class{
public $my_value = array();
function __construct( $value ) { // the constructor name is __construct instead of the class name
$this->my_value[] = $value;
}
function set_value ($value){
// Error occurred from here as Undefined variable: my_value
$this->my_value = $value; // remove the $ sign
}
}
$a = new my_class (''a'');
$a->my_value[] = ''b'';
$a->set_value (''c''); // your array variable here will be replaced by a simple string
// $a->my_class(''d''); // you can call this if you mean calling the contructor
// at this stage you can''t loop on the variable since it have been replaced by a simple string (''c'')
foreach ($a->my_value as &$value) { // look for foreach samples to know how to use it well
echo $value;
}
?>
Espero que ayude
De esta forma, puede crear un nuevo objeto con un nombre de propiedad personalizado.
$my_property = ''foo'';
$value = ''bar'';
$a = (object) array($my_property => $value);
Ahora puedes alcanzarlo así:
echo $a->foo; //returns bar
Interesante:
- Has declarado una matriz
var $my_value = array();
- Valor
$a->my_value[] = ''b'';
en él$a->my_value[] = ''b'';
- Asignado una cadena a variable. (por lo tanto, no es más una matriz)
$a->set_value (''c'');
- Intenté insertar un valor en una matriz, eso ya no existe. (es cadena)
$a->my_class(''d'');
Y tu foreach
no funcionará.
Me doy cuenta de que esta respuesta no es una respuesta directa al problema descrito por el OP, pero encontré esta pregunta como resultado de buscar el mismo mensaje de error. Pensé que valía la pena publicar mi experiencia aquí en caso de que alguien esté confundido por lo mismo ...
Puede encontrar el error en cuestión como resultado de un bucle mal formateado en una matriz asociativa. En un ataque de mal genio, estaba usando -> en vez de => en mi declaración:
foreach ($object->someArray as $key->$val) {
// do something
}
Por supuesto, debería haber tenido:
foreach ($object->someArray as $key=>$val) {
// do something
}
¡Al principio me confundí, pensando que el error informado se refería a la propiedad SomeArray!
Para acceder a una variable en una clase, debe usar $this->myVar
lugar de $this->$myvar
.
Y, debe usar el identificador de acceso para declarar una variable en lugar de var
.
Por favor, lea el documento here .
Primero, no declare variables usando var, pero
public $my_value;
Entonces puedes acceder usando
$this->my_value;
y no
$this->$my_value;
Usted accede a la propiedad de la manera incorrecta. Con la sintaxis $this->$my_value = ..
, establece la propiedad con el nombre del valor en $ my_value. Lo que quieres es $this->my_value = ..
$var = "my_value";
$this->$var = "test";
es lo mismo que
$this->my_value = "test";
Para arreglar algunas cosas de tu ejemplo, el siguiente código es un mejor enfoque
class my_class {
public $my_value = array();
function __construct ($value) {
$this->my_value[] = $value;
}
function set_value ($value) {
if (!is_array($value)) {
throw new Exception("Illegal argument");
}
$this->my_value = $value;
}
function add_value($value) {
$this->my_value = $value;
}
}
$a = new my_class (''a'');
$a->my_value[] = ''b'';
$a->add_value(''c'');
$a->set_value(array(''d''));
Esto asegura que my_value no cambiará su tipo a cadena u otra cosa cuando llame a set_value. Pero aún puede establecer el valor de my_value directo, porque es público. El último paso es hacer que my_value sea privado y solo acceder my_value a los métodos getter / setter