我还在学习OOP PHP,并且我继续在以下方法中调用方法中的方法之间进行交换和更改
$obj = new Model();
$obj->method($param);
针对
Model::method($params);
我理解我在方法中的区别,因为我可以在第一个例子中使用$ this,并且我必须在第二个中使用self ::。
哪种方法正确,使用各种方式的原因是什么
我问的原因是我找不到合适的搜索词进行研究。我目前正在阅读一本关于OOP的书,它可能会在某个时候讲出来,但现在知道的很好。
答案 0 :(得分:2)
Foo::bar()
调用静态类方法,而$foo->bar()
调用对象上的实例方法。这是两件完全不同的事情。您不需要对象实例来调用Foo::bar()
,实际上,在执行此操作时您无权访问实例数据。除了函数附加到类之外,Foo::bar()
基本上只是像bar()
这样的常规函数调用。
实例方法作用于特定的对象实例:
class User {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public static function hi() {
// no access to $this->name here, since static
// methods are not bound to specific instances
echo 'Hi';
}
}
$dave = new User('Dave');
$mary = new User('Mary');
echo $dave->getName(); // Dave
echo $mary->getName(); // Mary
User::hi(); // Hi
除非你理解 this ,否则你对OOP一无所知。
答案 1 :(得分:1)
第一个例子是对方法的非静态调用,第二个是静态调用
如果您想要访问Model
的私有变量,第一个更好,如果您使用像普通函数这样的方法,则第二个更好。
通常,您应该将第一种类型的方法声明为static(public static function method(){}
)。
答案 2 :(得分:0)
第一种情况是在类实例上调用方法,第二种情况是调用静态方法。
答案 3 :(得分:0)
没有“正确”的方式,因为两种呼叫类型都有不同的用途。
第一个调用类型是处理对象的标准方法:初始化类的具体实例。此实例可以有自己的内部值,当您使用相同的参数调用方法时,每个实例都可以使用这些值来创建不同的结果。
第二个调用类型称为static,直接在类上运行,没有实例(因此没有$this
)。有一些用例,请参阅this answer for Java,它与PHP相同。