1

我正在使用Mixpanel的 PHP API 并想调用mp->track.

在这种情况下,mp->track被定义为 mixpanel 库中的一个对象,称为 via require(mixpanel.php)

通常,这可以正常工作:

require ('mixpanel-php/lib/Mixpanel.php');
$mp = Mixpanel::getInstance("XXX");
$mp->track('Session');

但是,我想mp->track()从私有函数中调用,但以下给出了object not defined错误:

require ('mixpanel-php/lib/Mixpanel.php');
$mp = Mixpanel::getInstance("XXX")

private function startSession() {

$mp->track('Session');

}
4

3 回答 3

0

关键字private仅在类中使用时才有意义。在这里,您试图在类的上下文之外定义一个私有方法。即使这是在课堂上。您的函数范围将无权访问全局定义的$mp变量。您可能需要将该变量作为参数传递给方法。

于 2014-02-06T00:55:41.150 回答
0

显然,该$mp变量在该方法的范围内是不可访问的startSession()。这是因为它不是global。一种解决方案是设置$mp全局,但这不是一个好的软件设计。您应该将其作为函数变量传递

private function startSession($mp) {
    $mp->track('Session');
}

或者您应该在私有方法中获取实例本身

private function startSession() {
    Mixpanel::getInstance("XXX")->track('Session');
}
于 2014-02-05T23:16:10.850 回答
0

这是另一种方法;如果你定义

$mp = Mixpanel::getInstance("XXX");

在你班上的某个地方;你应该把它用作

$this->mp->track('Session');

所以你的代码应该看起来像

<?php
  require ('mixpanel-php/lib/Mixpanel.php');

  class MyClass {
    protected $mp;
    public function __construct() {
      $this->mp = Mixpanel::getInstance("XXX");
    }

    private function startSession() {
      $this->mp->track('Session');
    }

  }
?>
于 2014-02-05T23:18:04.643 回答