"自"在PHP7中访问类中的常量时

时间:2016-12-14 12:00:21

标签: php

我试图从另一个文件访问php类:

$john = new User();
$john->setPassword('123');
var_dump($john);

当通过长度<时,此类代码适用于所有异常。 8

class User
{
...
public $password;
const MINCHARS = 8;
...
public function setPassword($string){
if(strlen($string) < self::MINCHARS){
  throw new Exception("pass must be at least ". self::MINCHARS . 'chars long');
  }else{
    $this->password = hash('sha256', $string);
  }
}

但如果我将if语句改为(没有self ::)

if(strlen($string) < MINCHARS) 

并照常访问该课程

flow无声地转到else子句,没有任何错误或异常 在浏览器中我看到相当不错的字符串

object(User)#1 (2) { ["email"]=> string(10) "john@email" ["password"]=>   string(64) "a5b432ee0307be7fa23aa00461f54eee34ba9d45251b5504567d37a8da339dff" }

为什么&#34;如果&#34;认为在这种情况下是真的吗?

版本PHP是:

PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.8-0ubuntu0.16.04.3

适用于嵌入式服务器

php -S localhost:8080 

2 个答案:

答案 0 :(得分:2)

这是我在没有self ::

的情况下运行代码时看到的内容
  

PHP注意:使用未定义的常量MINCHARS - 假设&#39; MINCHARS&#39;   在第10行PHP上的/media/sf_thalia/sandbox/iterators/staticstuff.php中   堆栈跟踪:

我读到它,因为它将MINCHARS变成一个字符串然后进行比较。

以下是关于它的另一篇文章:What does the PHP error message "Notice: Use of undefined constant" mean?

回答者还说PHP奇怪地把它变成了一个字符串。我不知道为什么如果它正在搜索要做的事情,它至少不会尝试在类中使用常量。

您希望继续使用static::self::

答案 1 :(得分:2)

当你尝试在没有定义它的地方访问php中的常量时,它总是将const的名称作为字符串返回。

php manual你可以看到常量转换为整数(很可能是0),然后与strlen($string)进行比较。

只要字符串有1个字符,它将始终返回true。

请记住在任何时候都有PHP错误报告。

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

因此您将立即看到这些错误并立即修复它们。您始终可以在生产模式下停止错误报告。