PHP类和函数/未定义的变量

时间:2014-01-13 11:57:41

标签: php function class undefined

为什么我在函数接管时得到未定义的属性Takeover :: user2? 我不确定我做错了什么。有人可以帮忙吗? 我可以在主文件上调用user2-> addsaldo()但我不能在另一个函数中调用它。为什么呢?

班级用户

class User {
/**
 * @AttributeType int
 */
private $iduser;
/**
 * @AttributeType float
 */
private $saldo=0;
/**
 * @AssociationType Portefolio
 * @AssociationKind Composition
 */
public $idportefolio;

public function __construct($iduser){
    $this->iduser = $iduser;
}

/**
 * @access public
 */
public function getid() {
    // Not yet implemented
}

/**
 * @access public
 */
public function addsaldo($saldo) {
    $this->saldo = $saldo;
}
}

班级接管

    class Takeover {
    /**
     * @AttributeType int
     */
    private $idTakeover;
    /**
     * @AssociationType root
     * @AssociationMultiplicity 1
     */
    public $Root;

    public $IdeasTakerover=array();

    public function __construct($idTakeover){
        $this->idTakeover = $idTakeover;
    }
    /**
     * @access public
     */
    public function GetIdCompraRoot() {
        // Not yet implemented
    }

    public function AddIdeasTakeover($idTakeover, $idideia) {
        $this->idTakeover = $idTakeover;
        $this->idideia = $idideia;
        array_push($this->IdeasTakerover,$idideia);
    }
        /**
     * @access public
     */
        public function Takeover() {
            $this->user2->addsaldo(200); //USER2 DOES EXIST
    }
}

创建用户并调用它们:

$takeover = new Takeover(1);

for ($i=0; $i<$conta; $i++ ){
    $takeover->AddIdeasTakeover(1,$idsideias[$i]);
}

$takeover->Takeover();

if ($partial == "user") {
            $booleanUser = TRUE;
        $iduser=substr($buffer, 4);
        ${'user'.$iduser} = new User($iduser);
}

1 个答案:

答案 0 :(得分:0)

这个问题不在这个课程中。问题是$GLOBALS['user2']在此处引用时未定义:$GLOBALS['user'.$this->IdeiasTakeover[$i]]。然后,在addsaldo()中的未定义数组元素上调用$GLOBALS

另一方面,使用$GLOBALS编写好的代码是不可能的。全局变量是坏消息。您不应该使用/引用全局变量。引用$ _POST,$ _GET等时异常处于低级别。即使如此,所有优秀的PHP框架都将这些包装在请求对象中。

修改 依赖注入是一个类使用另一个类的更好方法:

class X {

  $yInstance;

  public function __construct($yInstance)
  {
    $this->yInstance = $yInstance;
  }

  public function x()
  {
    //Call your 'y' method on an instance of Y
    $this->yInstance->y();
  }
}

class Y {
  public function y()
  {
    echo 'Y::y() called!';
  }
}

调用X :: x()

$y = new Y();
$x = new X($y);
$x->x();

输出:

Y::y() called!

最简单的方法是使用依赖注入容器。这是我最喜欢的PHP:http://symfony.com/doc/current/components/dependency_injection/introduction.html

另外,请查看Martin Fowlers关于IOC的经典文章: http://martinfowler.com/articles/injection.html

祝你好运!