尝试分配非对象的属性时出错


Attempt to assign property of non-object error

我收到了这个错误,我看不出我做错了什么。我已经对其他类中的其他对象做了同样的事情,这些对象以完全相同的方式构建,我不明白为什么我现在会出现这个错误。

我创建对象的代码是这样的:

$consulta2 = "SELECT * FROM TiposDireccion WHERE Cliente_CIF='$cif' and Direccion_Direccion='$direccion' and Direccion_CP=$cp ";
                echo($consulta2."</br>");
                if ($resultado2 = $conexion->query($consulta2)){
                    while($fila2 = $resultado2->fetch_object()){
                        $tipodireccion78=$fila2->TipoDireccion_Tipo;
                        //we see here that the select is returning a correct string with a correct value
                        echo($tipodireccion78);
                        //we try to instantiate and it fails =(
                        $unTipoDireccion=TipoDireccion::constructor1($tipodireccion78); 

这是TipoDireccion:类

<?php
class TipoDireccion{
private $tipo;
private $descripcion;
//Construct auxiliar
function __construct() {
}
//Constructor 1 : completo
function constructor1($tipo) {
     $tipoDireccion = new TipoDireccion();
     $tipoDireccion->tipo = $tipo;
     return $tipoDireccion;
}
function ponTipo($tipo) {
    $this->tipo = $tipo;
 }
function devuelveTipo() {
     return $this->tipo;
 }
function ponDescripcion($descripcion) {
     $this->descripcion = $descripcion;
 }
function devuelveDescripcion() {
     return $this->descripcion;
}   
}
?>

提前非常感谢!

不知道这是否仍然与您有关,但以防其他人来这里寻求答案。问题出在这个功能上:

function constructor1($tipo) {
     $tipoDireccion = new TipoDireccion();
     $tipoDireccion->tipo = $tipo;
     return $tipoDireccion;
}

因为在类定义中,您定义了private $tipo;,然后尝试将$tipoDireccion->tipo分配给通过函数传递的内容。然而,您并不是试图通过类的作用域来访问该变量,而是试图从类的"public"作用域来分配它。

对此的修复有两个选项,第一个选项是将private $tipo;更改为public $tipo;。但这不是一个好的解决方案,因为你有一个分配函数

相反,使用你制作的函数,这会使函数看起来像:

function constructor1($tipo) {
     $tipoDireccion = new TipoDireccion();
     $tipoDireccion->ponTipo($tipo);
     return $tipoDireccion;
}

这就是你需要从公共范围访问它的方式,这是你在启动一个新的范围后所做的。

function constructor1($tipo) {}

应该是

static function constructor1($tipo) {}