在学习中遇到了一下问题
以下两种写法,在学习后都是可以的
$list =article::order('id','desc')->paginate(5);
$ar=new article();
$list =$ar->order('id','desc')->paginate(5);
以下的写法都是错误的:
写法1:$list =article->order('id','desc')->paginate(5);
写法2:$list =article::order('id','desc')::paginate(5);
通过查阅以下资料分析
php中的::是调用类中的静态方法或者常量,属性的符号
article 为未实例化对象在引用其order 方法时必须使用::否则需要先实例化对象
而在写法2中前面已经使用:: 对对象进行了实例化,此时必须使用->引用方法
总结::引用未实例化对象并相当于对其进行了实例化操作,而->必须调用已经实例化的对象。
ps:=>比较简单在初学时可以将其理解为=
例如
class aaa{
static function ar(){
}
function br(){}
}
使用非静态方法,要先创建实例
$obj = new aaa();
$obj -> br();
使用静态方法,无需创建实例,直接使用类名
aaa::ar();
在类里面的时候,$this->func()和self::func()没什么区别。
在外部的时候,->必须是实例化后的对象使用; 而::可以是未实例化的类名直接调用。
举个例子:
class Mytest{
function ccc($str){
echo $str;
}
}
Mytest::ccc("123456");
$object = new Mytest();
$object->ccc("123456");
追问
是不是说实例化的类不能使用::?
而未实例的类可不可以使用->呢?
追答
你用我的例子,分别试一下Mytest->ccc("->")和$object::ccc("::")就知道答案了。(都会报错)
静态属性不可以由对象通过->操作符来访问。
用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
转载请注明出处: