php 对像函数不存在时,PHP致命错误:当不在对象上下文中时使用$ this

本文讨论了在PHP中遇到的‘当不在对象上下文中使用$this’的致命错误,解释了该错误产生的原因:尝试在静态调用中使用非静态方法。文章详细阐述了对象上下文、静态方法和非静态方法的区别,并提供了正确的调用方式示例。同时,建议避免在类中使用全局变量,并推荐使用依赖注入以提高代码的可维护性和减少对外部的依赖。
摘要由CSDN通过智能技术生成

PHP致命错误:当不在对象上下文中时使用$ this

我有一个问题:

我正在编写一个没有框架的新WebApp。

在我的index.php我使用: require_once('load.php');

在load.php我使用require_once('class.php'); 加载我的class.php 。

在我的class.php我有这个错误:

致命错误:当不在class.php的对象上下文中使用$ this时…(在这个例子中是11)

一个例子是如何写我的class.php :

class foobar { public $foo; public function __construct() { global $foo; $this->foo = $foo; } public function foobarfunc() { return $this->foo(); } public function foo() { return $this->foo; } }

在我的index.php我加载也许foobarfunc()像这样:

foobar::foobarfunc();

但也可以

$foobar = new foobar; $foobar->foobarfunc();

为什么会出现错误?

在我的index.php我加载也许foobarfunc()像这样:

foobar::foobarfunc(); // Wrong, it is not static method

但也可以

$foobar = new foobar; // correct $foobar->foobarfunc();

你不能这样调用方法,因为它不是静态方法。

foobar::foobarfunc();

你应该使用:

foobar->foobarfunc();

但是,如果您创build了一个静态方法,如下所示:

static $foo; // your top variable set as static public static function foo() { return self::$foo; }

那么你可以使用这个:

foobar::foobarfunc();

你正在调用一个非静态的方法:

public function foobarfunc() { return $this->foo(); }

使用静态调用:

foobar::foobarfunc();

当使用静态调用时,函数将被调用(即使没有声明为static ) ,但是,由于没有对象的实例,所以没有$this 。

所以:

你不应该使用非静态方法的静态调用

你的静态方法(或静态调用的方法)不能使用$ this,通常指向类的当前实例,因为在使用静态调用时没有类实例。

在这里,你的类的方法是使用类的当前实例,因为他们需要访问类的$foo属性。

这意味着你的方法需要一个类的实例 – 这意味着它们不能是静态的。

这意味着你不应该使用静态调用:你应该instanciate类,并使用该对象调用方法,就像你在你的代码的最后一部分:

$foobar = new foobar(); $foobar->foobarfunc();

有关更多信息,请不要犹豫,在PHP手册中阅读:

类和对象部分

和“ 静态关键字”页面。

另外请注意,你的__construct方法中可能不需要这一行:

global $foo;

使用global关键字将使$foovariables,在所有函数和类之外声明,从该方法中visibile …而且您可能没有这样的$foovariables。

要访问$foo 类属性 ,只需要使用$this->foo ,就像你一样。

如果你使用parsing范围操作符 ( :: foobarfunc调用foobarfunc ,那么你是静态调用它,例如在类级别而不是实例级别,因此, 当不在对象上下文中时使用$this 。 $this在类上下文中不存在。

如果你启用E_STRICT ,PHP会提出一个关于这个的通知:

Strict Standards: Non-static method foobar::foobarfunc() should not be called statically

做这个,而不是

$fb = new foobar; echo $fb->foobarfunc();

在旁注中,我build议不要在课堂上使用global 。 如果你需要从外部的东西,通过构造函数。 这就是所谓的dependency injection ( Dependency Injection) ,它会使你的代码更易于维护,而且更less依赖于外部事物。

首先,你明白一件事, $这里面的一个类表示当前的对象 。

那就是你在类的外面创build了哪个类来调用类的函数或variables。

所以当你调用你的类函数foobar :: foobarfunc()时,不会创build对象。 但是在你写的函数里面返回$ this-> foo()。 现在这里$这是没有什么。 这就是为什么说它使用$ this,而不是在class.php中的对象上下文

解决scheme:

创build一个对象并调用foobarfunc()。

在foobarfunc()中使用类名调用foo()。

当你在一个静态的上下文中调用这个函数时, $this根本就不存在。

你将不得不使用this::xyz()来代替。

为了找出在静态和对象实例中调用函数时所处的上下文,在这个问题中列出了一个很好的方法: 如何判断我是静态对象还是对象?

快速的方法:( 新的foobar()) – > foobarfunc();

你需要加载你的类replace:

foobar::foobarfunc();

通过:

(new foobar())->foobarfunc();

要么 :

$Foobar = new foobar(); $Foobar->foobarfunc();

或者使静态函数使用foobar:: 。

class foobar { //... static function foobarfunc() { return $this->foo(); } }

$foobar = new foobar; 把类 foob​​ar放在$ foobar中, 而不是对象 。 要获取对象,需要添加括号: $foobar = new foobar();

你的错误只是你调用一个类的方法,所以没有$this因为$this只存在于对象中。

很简单 : ..!

只需在你的property和你的function之前插入static ;

使用这个foobar->foobarfunc();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值