为什么我可以在不声明类对象的情况下调用非静态函数?

时间:2015-06-29 04:54:00

标签: php apache oop model-view-controller symfony1

我正在使用Symfony 1.0,我的MyClassInc.class.php文件夹中有project/lib

class MyClassInc {
  public function validateFunction ($params) {
    // my codes
  }
  static function testFunction ($params){
    // my codes
  }
}

然后,我的actions.class.php中的project/apps/myapps/modules/actions行动。

class inventoryCycleCountActions extends sfActions
{
  public function validateOutstandingTransaction () {
    $res0 = MyClassInc :: validateFunction($param); // It works
    $res1 = MyClassInc :: testFunction($param); // It works
    $myClass = new MyClassInc();
    $res2 = $myClass->validateFunction($param); // still works
    $res3 = $myClass->testFunction($param); // still works, da hell?
  }
}

我试图清除我的缓存文件夹进行重新测试,但似乎所有这些工作都很好。

问题: 所以为什么?我应该使用哪一个?它对性能有什么影响吗?

更新1:

class MyClassInc {
  public function isProductValidated ($product){
    return true;
  }
  public function validateFunction ($params) {
    // IF, I call by using "$res0".. Throws error
    //
    $this->isProductInLoadPlans($product);
  }
}

如果我通过 $ res0 调用validateFunction,则会抛出此错误:

  

sfException:调用未定义的方法   inventoryCycleCountActions :: isProductValidated。

,如果我通过 $ res2 调用它,它就可以了。

因为,我目前正在使用 $ res0 ,所以我必须这样调用这个方法。

  

MyClassInc :: isProductValidated($ product)

1 个答案:

答案 0 :(得分:0)

::->之间唯一真正的区别在于$this的处理方式。使用::,函数将具有$this,因为它是在调用者的范围中定义的:

class A {

  public function foo() {
    A::bar();
    A::foobar();
  }

  static private function bar() {
     // $this here is the instance of A
  }

  static public function foobar() {
    // Here you can have anything in $this (including NULL)
  }
}

$a = new A;
$a->foo();
$a->foobar(); // $this == $a but bad style
A::foobar(); // $this == NULL

如果要使用实例方法,则应使用->,因为这样可以正确解析实例方法(包括继承)。 ::将始终调用指定类的方法。

我相信现在已经努力强制调用静态方法只能动态地静态和动态方法,以避免混淆。