PHP 问题:类方法
问题
这两行代码有什么区别,您能否生成用于它们的后台代码?
//1号线 $MyClass->MyMethod(); //2号线 MyClass::MyMethod();
回答
第一行代码是普通的对象方法调用,要求先实例化对象。会这样写。
MyMethod();
第二行代码是静态方法调用,无需先实例化对象即可使用。它会这样写(注意方法声明中的static关键字):
->符号用于访问对象的方法和属性,而::符号仅用于访问静态方法和属性。
将方法定义为静态不需要您静态使用它,但确实应该避免这样做。你可以拥有一个混合了静态和非静态方法的对象,但你必须小心你在做什么,否则你会发现代码中出现错误。例如,如果您在类中有一个静态方法,并且您尝试使用$this访问对象本身(即使您已经先实例化了该对象),您将收到以下致命错误。
Fatalerror:Using$thiswhennotinobjectcontextintest.phponlinex
这是使用静态方法时最重要的考虑因素。它们不会在对象上下文中被调用,这意味着您不能使用$this关键字来引用对象本身,因此您不能访问类中的任何其他方法或属性,除非它们也是静态的。
如果您尝试在非静态上下文中访问静态属性,您还会发现出现的错误。例如,采用以下包含单个静态变量的类定义。
如果您尝试实例化对象,然后访问静态属性以在非静态上下文中打印它:
//创建对象。 $myobject = new MyClass(); //访问静态属性。 echo $myobject->var;您将收到以下通知,并且不会打印任何内容(即无法访问该属性)。
Notice:Undefinedproperty:MyClass::$varintest.phponlinex
如果您尝试通过在方法中使用$this->var从非静态上下文中的类中访问属性:
//定义类 class MyClass { public static $var = 3; public function MyMethod() { $this->var = 5; } } //创建对象 $myobject = new MyClass(); //访问静态属性 echo $myobject->MyMethod();一切都会按预期工作,但PHP也会向您发出严格的标准警告。
Strictstandards:AccessingstaticpropertyMyClass::$varasnonstaticintest.phponlinex
因此,在它们自己的类中定义静态方法和属性通常是一种很好的做法,这样您就不会开始混淆它们并尝试在非静态上下文中访问静态属性。如果您想在运行时更改静态变量的值,那么它可能根本不应该是静态的。