静态调用非静态方法!!这在java,c#中是不可想象的,也是绝对不行的。这样的错误在这些语言中会在编译阶段就被指出错误的。但是对于php这样的动态语言呢?首先这个是语法没有错误的,php –l 找不出错误来的。如果运行呢?先看一个例子复制代码 代码如下:<?php class myClass { private $name = “myClass”; public function echoName(){ echo $this->name; } public function getName(){ $this->echoName() 在PHP编程语言中,静态调用非静态方法是一种特殊情况,虽然在Java或C#等静态类型语言中会被编译器捕获并报错,但在PHP这样的动态语言中却是可行的,尽管并不推荐。PHP允许这样的调用主要是为了保持向后兼容,尤其是考虑到PHP 4中的历史遗留问题。 在PHP中,静态方法的调用通常通过类名::方法名的形式进行,而静态方法不依赖于对象实例,即它们没有`$this`指针。然而,非静态方法则需要一个对象实例来执行,因为它们可以访问和操作实例变量,如`$this->name`。 让我们深入探讨一下这个话题: 看一个例子: ```php class myClass { private $name = "myClass"; public function echoName() { echo $this->name; } public function getName() { $this->echoName(); } } class newClass { private $name = "newClass"; public function echoName() { echo $this->name; } public function test() { myClass::getName(); // 静态调用非静态方法 echo "\n"; } } $app = new newClass(); $app->test(); ``` 这段代码会抛出PHP Strict Standards Error,因为它试图以静态方式调用非静态方法`myClass::getName()`。不过,在PHP 5.3.10之前的某些版本,这种行为可能是允许的,但在之后的版本中被视为不标准的实践。 在PHP 4中,如果没有关键字`parent`,子类要调用父类的同名方法时,可以通过类名::方法名的方式,这实际上允许了静态调用非静态方法。而在PHP 5中,引入了`parent`关键字来更清晰地处理这种情况,但为了保持向后兼容,早期的语法仍然有效。 关于“calling scope”(调用范围),它是PHP中方法调用的一个关键概念。在静态方法中,没有明确的`$this`指针,这意味着没有特定的对象实例。而在非静态方法中,`$this`指向调用该方法的对象实例。 例如: ```php class A { public function __construct() {} } class B extends A { public function __construct() { parent::__construct(); // 子类将调用范围转换为父类A的调用范围 } } ``` 在`parent::__construct()`中,调用范围被转换为父类`A`的上下文,因此可以正确地调用父类的构造函数。 回到最初的示例,当我们调用`myClass::getName()`时,由于没有使用`parent`关键字或重新定义`$this`,调用范围保持不变,仍然是`$app`对象。因此,`echo $this->name;`会尝试访问`$app`对象的`name`属性,即使`getName()`方法是非静态的。 总结来说,尽管PHP允许静态调用非静态方法,但这可能会导致意外的结果和编码规范错误。为了避免这些问题,最佳实践是始终明确区分静态和非静态方法的使用,并遵循面向对象的编程原则,如封装和继承。在编写代码时,尽量避免静态调用非静态方法,除非在了解其潜在影响和历史背景的情况下。同时,确保对错误报告进行适当的配置,以便在开发过程中及时发现此类问题。























- 粉丝: 8
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 现代通信技术概论大作业北京印刷学院(1).doc
- 构建新一代企业大数据平台(1).pptx
- 信息化系统集成项目工程竣工报告(1)(1).doc
- 网络爬虫需求分析(1).docx
- 网络通信类visio图库.pdf
- 物联网工程专业学业规划书(1).doc
- 计算机组成原理:6-4-中央处理器(1).pptx
- C语言基础(1).ppt
- 本科毕业设计--基于单片机的ad590的温测控系统设计(1).doc
- 高校计算机实验室管理与维护探讨(1).docx
- 物联网发展状况及应用模式(1).pptx
- 计算机网站建设的规划设计(1).docx
- 基于工程管理信息化与BIM技术应用分析(1).docx
- 云计算环境下图书馆自动化系统发展探索(1).docx
- 图书管理系统测试计划说明书(1).doc
- 财务会计制度及核算软件备案报告表(1).doc


