Php 如何设置和使用受保护的静态属性?
这是一个我必须使用的抽象类Php 如何设置和使用受保护的静态属性?,php,oop,Php,Oop,这是一个我必须使用的抽象类 abstract class Model { protected static $_tableName = false; public static function tableName() { return static::$_tableName; } public static function find($idOrWhere = false, $params = array(), $limit = f
abstract class Model
{
protected static $_tableName = false;
public static function tableName()
{
return static::$_tableName;
}
public static function find($idOrWhere = false, $params = array(), $limit = false)
{
$sql = "SELECT * FROM " . static::tableName();
我似乎无法在自己的类中设置_tableName、static::tableName()或tableName()
class Payments extends Model {
public function __construct()
{
$this->_tableName = 'payments';
}
那没用!它没有将tableName设置为payments。我也不知道如何使用tableName()方法。您正在尝试以非静态方式访问
\u tableName
(即$this->\u tableName
),即使您已将其声明为静态
您需要像这样访问它:
self::$_tableName
或者,对于:
总的来说,您应该尽量避免使用静态类,主要是出于测试目的。静态成员必须在类上访问,而不是在实例上访问:
class Payments extends Model {
public function __construct()
{
Payments::$_tableName = 'payments';
}
}
声明为静态的属性不能通过实例化的类对象访问(尽管静态方法可以)
无法使用箭头运算符->通过对象访问静态属性
与任何其他PHP静态变量一样,静态属性只能使用文本或常量初始化;不允许使用表达式
根据这篇材料,你的课程应该以这种方式修改
abstract class Model
{
protected static $_tableName = false;
public static function find($idOrWhere = false, $params = array(), $limit = false)
{
$sql = "SELECT * FROM " . self::tableName();
...
}
private static function tableName()
{
if (!static::$_tableName) {
throw new \RuntimeException('No table name provided');
}
return static::$_tableName;
}
顺便说一句,对象实例化时会调用
\u construct
,您不应该在那里设置任何静态属性值
abstract class Model
{
protected static $_tableName = false;
public static function find($idOrWhere = false, $params = array(), $limit = false)
{
$sql = "SELECT * FROM " . self::tableName();
...
}
private static function tableName()
{
if (!static::$_tableName) {
throw new \RuntimeException('No table name provided');
}
return static::$_tableName;
}
class Payments extends Model {
protected static $_tableName = 'payments';
}