我试图从另一个文件访问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
答案 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);
因此您将立即看到这些错误并立即修复它们。您始终可以在生产模式下停止错误报告。