这些对象调用之间有什么区别?
非静态:
$var = new Object;
$var->function();
静态:
$var = User::function();
并且在class
内部为什么我应该为函数使用静态属性?
示例:
static public function doSomething(){
...code...
}
答案 0 :(得分:38)
根据定义,静态函数不能也不依赖于类的任何实例属性。也就是说,它们不需要执行类的实例(因此可以在没有首先创建实例的情况下执行,因此可以执行)。从某种意义上说,这意味着该函数不会(并且永远不需要)依赖于类的成员或方法(公共或私有)。
答案 1 :(得分:10)
差异在于变量范围。想象一下你有:
class Student{
public $age;
static $generation = 2006;
public function readPublic(){
return $this->age;
}
public static function readStatic(){
return $this->age; // case 1
return $student1->age; // case 2
return self::$generation; // case 3
}
}
$student1 = new Student();
Student::readStatic();
你的静态函数无法知道$ this是什么,因为它是静态的。如果可能有$ this,那么它将属于$ student1而不是Student。
它也不知道什么是$ student1。
它适用于案例3,因为它是一个属于该类的静态变量,与之前的2不同,属于必须实例化的对象。
答案 2 :(得分:7)
静态方法和成员属于类本身,而不属于类的实例。
答案 3 :(得分:7)
静态函数或字段不依赖于初始化;因此,静态。
答案 4 :(得分:1)
有关STATIC功能的问题不断回归。
根据定义,静态函数不能也不依赖于类的任何实例属性。也就是说,它们不需要执行类的实例(因此可以执行。 从某种意义上说,这意味着该函数不会(并且永远不需要)依赖于类的成员或方法(公共或私有)。
class Example {
// property declaration
public $value = "The text in the property";
// method declaration
public function displayValue() {
echo $this->value;
}
static function displayText() {
echo "The text from the static function";
}
}
$instance = new Example();
$instance->displayValue();
$instance->displayText();
// Example::displayValue(); // Direct call to a non static function not allowed
Example::displayText();