不使用静态方法时,在不在对象上下文中时使用$ this

时间:2016-06-03 08:58:34

标签: php class oop object static-methods

我试图手动解密我自己的云文件进行测试,但我不太了解PHP语言。

我面临的问题是:

  

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

我环顾了一段时间,但我遇到的只是错误地使用$this和静态方法。但是,我编辑的文件中没有任何静态方法。

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

的script.php:

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

.
.
.

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

.
.
.

这是其他crypt.php文件,其中发生致命错误 crypt.php

<?php
namespace OCA\Files_Encryption\Crypto;

class Crypt {

.
.
.

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

}

最后一行代码抛出致命错误。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可能没有将decryptPrivateKey定义为static,但这就是您使用它的方式。

然后继续使用$this,当它实际上不是实例化对象的一部分时。

尝试在script.php

中使用它
$crypt = new Crypt();
$decryptedUserKey = $crypt->decryptPrivateKey($encryptedUserKey, $userPassword);

答案 1 :(得分:2)

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

此外,您尚未将 decryptedPrivateKey 方法声明为静态。

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

(1)使用对象调用

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

OR

(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方法也是静态OR

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
}

希望它会对你有所帮助: - )