• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

php未实例化类调用方法的问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

之前看手册一直以为范围解析操作符只能操作类中的静态方法,静态成员以及常量等等,并未去具体实验,今日才发现原来双冒号操作符其意义应该是不实例化类而调用类中的方法或者成员等。举例如下:

class A
{
public function show()
{
echo “Hello World!”;
}
}

A::show();

此时调用是很ok的,正常输出”Hello World!”,因为此时方法中并无变量等出现,而代码常量在编译之时就已经保存到代码段了。

class A
{
public $str = “Hello World!”;

public function show()
{
echo $this->str;
}
}

A::show();

此时调用会报错,因为此时调用了类A中的$this,而$this只有在类实例化之后才会被赋值。指代的是当前类的实例化的对象。

class A

{
public $str = “Hello World!”;

public function show()
{
echo self::$str;
}
}

A::show();

好,既然前一例是因为类没有实例化导致$this伪变量为赋值而无法访问,那么我们使用self关键字进行访问会如何的,结果还是报错,因为self只能访问当前类的静态方法或成员。所以类中的方法如果可以无需实例化而直接调用的话,最好将其声明为static的方法,这样在方法中若调用类中的变量的话就只调用静态的变量,防止出现以上的问题,而如果是非static的方法则最好实例化对象后通过实例调用,防止出现其他问题。然后还有一个情况

class A
{
public function show()
{
echo $this->str;
}
}

class B

{
public $str = “Hello World!”;

public function test()
{
A::show();
}
}

$test = new B();
$test->test();

此处程序运行的结果是输出”Hello World!”,因为$this是指向当前类实例化的一个对象,其作用范围为当前对象的上下文,而此处A::show()中的$this其实是指向B类实例化的对象 ,而且正在对象上下文中,所以能够输出B中的变量$str的值。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php:file()与file_get_contents():讲日志文件没行读为数组形式发布时间:2022-07-10
下一篇:
PHP判断字符串的包含发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap