这是我必须使用的抽象类;
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设置为付款。我无法弄清楚如何使用方法tableName()。
答案 0 :(得分:3)
您尝试以非静态方式访问_tableName
(即$this->_tablename
),即使您已将其声明为静态。
您需要像这样访问它:
self::$_tableName
static::$_tableName
总的来说,您应该尽可能避免使用静态类,主要是出于测试目的。
答案 1 :(得分:1)
必须在类上访问静态成员,而不是在实例上访问:
class Payments extends Model {
public function __construct()
{
Payments::$_tableName = 'payments';
}
}
答案 2 :(得分:1)
使用实例化的类对象无法访问声明为static的属性(虽然静态方法可以)。
使用箭头操作符 - >。
无法通过对象访问静态属性
http://php.net/manual/en/language.oop5.static.php
与任何其他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;
}
class Payments extends Model {
protected static $_tableName = 'payments';
}
顺便说一句,__contruct
在对象实例化时被调用,你不应该在那里设置任何静态属性值。