我在我的课程中遇到一个问题,即在函数内部使用static private
变量不起作用。但是当正则表达式直接位于其中时它确实有效。
class Object{
static private $regex = "/\w+|\-\d+/";
//does not work (NULL)
public function tokenize($text){
preg_match_all($this->regex, $text, $matches);
var_dump($matches);
}
//works
public function tokenize($text){
$regex = "/\w+|\-\d+/";
preg_match_all($regex, $text, $matches);
var_dump($matches);
}
}
$o = New Object;
$o->tokenize("test text -123");
答案 0 :(得分:1)
你将正则表达式var声明为static
(并且它错过了$,但我认为这是一个不同的错误)。静态变量不能作为对象属性($this->regex
)访问,但它可以作为$ regex使用,因为您正在第二个函数的范围内定义它。
因此,如果要将其用作属性,可以通过删除static
修饰符来解决问题。否则,您可以使用self::$regex
或Object::$regex
从对象内部的任何位置静态访问它(后者也在对象之外,但只有在公共场所之外)。
答案 1 :(得分:1)
截至the docs:
将类属性或方法声明为静态使它们可以访问,而无需实例化类。声明为static的属性无法使用实例化的类对象访问(尽管静态方法可以)。
要在您尝试立即执行此操作时从您班级中的非private static
上下文访问static
属性,您应该使用
self::$regex
或者您可以将$regex
媒体资源重新声明为仅private
(非static
),然后您就可以$this->regex