5
回答
php类继承 成员属性的值
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

Model类里有一个protected $table=null,构造函数里对他进行了初始化:this->table=!is_null($table)?$table:C('TABLE_NAME');

userModel继承了Model类

class UserModel extends Model{
//我直接写成下面的为啥,$table改变不了?

protected $table='user';

}

PHP
举报
manbudezhu
发帖于1年前 5回/263阅
共有5个答案 最后回答: 1年前
同学  昨天跟你说了了解下static 延迟绑定
--- 共有 6 条评论 ---
大止刀口回复 @大树_ : 确实是可以用于在非静态成员函数。不过这也和楼主要在子类里给父类定义的变量赋值没太大关系吧。 1年前 回复
大树_回复 @士止刀口 : 好好看看哦 掌握了事实依据再来反驳. http://php.net/manual/zh/language.oop5.late-static-bindings.php "也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。"重点看这里 1年前 回复
大止刀口回复 @大树_ : 楼主要的是重新给一个成员变量赋值。static::function()这种形式,只是用于父类定义的函数里,调用自己定义的函数后,如果子类覆盖了function,父类能调用子类的function而已。而这些函数都是静态函数好吧。静态函数没有$this,你怎么给$this->table赋值? 1年前 回复
大树_回复 @士止刀口 : 延迟绑定和静态有关系? 1年前 回复
大止刀口这个变量不是静态的,static延迟不管用吧。而且这东西也不是单例。 1年前 回复
用$this->table='user';可以改变 但是这个 只能放到函数里吧.怎么直接改变$table的值了
--- 共有 1 条评论 ---
大止刀口你还是老老实实在子类的构造函数调用父类的构造函数,传入初始值吧。毕竟 封装 就是为了避免你这么做的。你想通过直接在定义的地方赋值不现实,毕竟这个变量是在父类里定义的。 1年前 回复
Model类里面用$table给$this->table赋值了,这两个是不同的变量啊。你子类的$this->table并不能作为子类函数里面的$table用

this->table=!is_null($table)?$table:C('TABLE_NAME');

这一句说明父类的构造函数应该是容许你调用parent::__construct时传递一个$table参数来为它初始化的,如果$table为null再利用C这个函数做默认初始化。

$table这个变量是由父类定义的,所以初始化应该在父类里进行。而且父类也提供了可传参的构造函数了吧。就这么不情缘写构造函数啊。。。。。。

顶部