php - 当不在对象上下文中而不使用静态方法时使用 $this

标签 php class oop object static-methods

我正在尝试手动解密 my owncloud 的文件来测试它,但我不太了解 PHP 语言。

我面临的问题是:

PHP Fatal Error: Using $this when not in object context

我环顾了一段时间,但我发现的只是错误地将 $this 与静态方法一起使用。但是,我正在编辑的文件中没有任何静态方法。

有一个文件 'script.php',我在其中调用另一个文件的 (crypt.php) 方法。

脚本.php:

<?php 
namespace OCA\Files_Encryption\Crypto;
use OCA\Files_Encryption\Crypto\Crypt;
require_once 'crypt.php';

.
.
.

$decryptedUserKey = Crypt::decryptPrivateKey($encryptedUserKey, $userPassword);

.
.
.

这是另一个 crypt.php 文件,其中发生了 fatal error 密码.php

<?php
namespace OCA\Files_Encryption\Crypto;

class Crypt {

.
.
.

public function decryptedPrivateKey($privateKey, $password = '', $uid = '') {
    $header = $this->parseHeader($privateKey);
.
.
.
}

}

最后一行代码抛出 fatal error 。有什么想法吗?

最佳答案

静态调用中不能使用$this。因为 $this 引用的是当前对象,并且您还没有为 Crypt 类创建任何对象。

此外,您还没有将 decryptedPrivateKey 方法声明为静态。

可以通过两种方式调用类方法。您可以使用Tom Wright's建议方式

(1)使用对象调用

$crypt = new Crypt(); // create class object
$decryptedUserKey = $crypt->decryptPrivateKey($encryptedUserKey, $userPassword); // call class method via object 

或者

(2)无对象调用(静态调用)

a) 您应该将方法定义为静态。

b) 您应该使用 self keyword并调用另一个静态方法,

public static function decryptedPrivateKey($privateKey, $password = '', $uid = '') {
    $header = self::parseHeader($privateKey);
}

public static function parseHeader() { // static parseHeader
  // stuff
}

在上述情况下,parseHeader方法也必须是静态的。

所以你有两个选择:-

i) 要么将 parseHeader 方法声明为静态,要么

ii) 创建当前类的对象并调用非静态方法parseHeader

public static function decryptedPrivateKey($privateKey, $password = '', $uid = '') {
     $obj = new self(); // create object of current class
     $header = $obj->parseHeader($privateKey); // call method via object
}

public function parseHeader() { // Non static parseHeader
  // stuff
}

希望对你有帮助:-)

关于php - 当不在对象上下文中而不使用静态方法时使用 $this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37610111/

相关文章:

class - 在PowerShell 5中是否可以为类声明通用属性?

c++ - .h 和 .cpp 文件中的默认参数

php - 使用sqlite/PHP获取两个不同行/列中两个数字的方差和标准差

java - 如何使用 EasyMock 模拟从抽象类继承的方法?

php - SQL 查询总是在最后得到 '1' Laravel Eloquent

css - A.类 :LINK only works for 1st element in Firefox

PHP 5.4 调用关闭超时

c# - 继承和接口(interface) .NET

php - 使用 php 替换 css 中的前导点和斜线

php - 在后台运行脚本并从 php 返回它的 pid