本文目录一览:
- 1、thinkphp 模板继承问题
- 2、PHP类继承的问题,子类继承父类,实例化子类,先执行父类还是先执行子类?
- 3、php 继承一个类一定要引用一下吗
- 4、thinkphp5.1,类继承问题请问我的为什么是错的。class Index extends \think\Controller?
- 5、php中静态类的继承
- 6、PHP继承的问题,调用父类的方法this指向问题。
thinkphp 模板继承问题
thinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:视图目录/[模板主题/]控制器名/操作名+模板后缀。默认的视图目录是模块的View目录(模块可以有多个视图文件目录,这取决于你的应用需要),框架的默认视图文件后缀是.html。新版模板主题默认是空(表示不启用模板主题功能)。在每个模板主题下面,是以模块下面的控制器名为目录,然后是每个控制器的具体操作模板文件,例如:User控制器的add操作对应的模板文件就应该是:View/User/add.html一些其他配置:1.'DEFAULT_V_LAYER'='Template',//设置默认的视图层名称//结果:Template/User/add.html2.'TMPL_TEMPLATE_SUFFIX'='.tpl',//设置默认后缀//结果:View/User/add.tpl3.'TMPL_FILE_DEPR'='_',//配置模板的目录层次//结果:View/User_add.html4.'DEFAULT_THEME'='default',//设置默认的模板主题//没有启用模板主题之前View/User/add.html//启用模板主题之后View/default/User/add.html
PHP类继承的问题,子类继承父类,实例化子类,先执行父类还是先执行子类?
不是这个意思。所谓“实例化子类的对象前要先实例化父类中的内容,为父类初始化”,是指当子类正在实例化时,总是链式调用父类构造方法初始化父类空间。换句话说,子类的构造方法必须先调用父类的构造方法,完了才能干别的初始化工作。如果子类没有显式调用语句,编译器会隐式帮你加上。
如:
public class A{ public A() { }}public class B extends A{ public B() { }}等价于:
public class A{ public A() { super();//这里实际上是Object(); //其他初始化工作 }}public class B extends A{ public B() { super();//这里实际上是A(); //其他初始化工作 }}另外,如果有这种情况:
public class A{ X x=new X(); public A() { }}public class B extends A{ Y y=new Y(); public B() {//这是类A空间里的字段都已经初始化完毕。 }}在成员y被赋值之前,x一定已经存在。换句话说,X x=new X();一定先于Y y=new Y();执行。
php 继承一个类一定要引用一下吗
php有自动加载类的功能,但是需要遵循一定的规则,并且需要额外的代码支持实现。
对于你说的问题,较常见的情况是b.php里面虽然没有引用a.php,但是c.php可能引用了a.php及b.php。只要在一个php进程中保证引用了这些文件就行,引用位置是可变的。例如在第一行引用和在第二行引用没有区别,只要在new之前引用过就好了。但是明显这不是值得推荐的。
thinkphp5.1,类继承问题请问我的为什么是错的。class Index extends \think\Controller?
单词错啦好几个,field不是filed,assign不是assgin,这些都是方法名,是不可以错的,还有这个错误提示的意思是变量未定义,你要检查下相关的字段是否存在。
php中静态类的继承
楼主这个问题跟静态没有多大关系,主要是继承的概念没有搞清楚,继承一个类是将子类拥有了调用父类的方法和属性的权利,并不是说将父类的方法复制到了子类中self方法相当于当前类的指针,你那样调用相当于写了
public static function test() {
parent::who();
}
这样的代码,所以才会出现那样的结果
PHP继承的问题,调用父类的方法this指向问题。
我来说一说:
【一】…………public(仅有)属性和方法的继承…………
class a{
public $var = 'var a br/';
public function m(){
echo 'fun a br/';
}
public function run(){
echo $this-var;
$this-m();
}
}
class b extends a{
public $var = 'var b br/';
public function m(){
echo 'fun b br/';
}
}
$li = new b();
$li-run();
echo 'hr';
var_dump($li);
输出:
var b
fun b
————————————————————————————
object(b)[1]
public 'var' = string 'var b br/' (length=11)
在这段代码中所表示的,是我们常见的一种继承方式,同为公有属性的$var 和公有方法m()
在这里,$var和m()都被继承并覆写,实例化过后,内存中只有一个$var实例,通过var_dump($li);我们可以看到它。
【二】…………private(私有)属性和方法的继承…………
class a{
private $var = 'var a br/';
private function m(){
echo 'fun a br/';
}
public function run(){
echo $this-var;
$this-m();
var_dump($this);
echo 'br/br/';
}
}
class b extends a{
private $var = 'var b br/';
private function m(){
echo 'fun b br/';
}
public function run(){
echo $this-var;
$this-m();
var_dump($this);
echo 'br/br/';
parent::run();
}
}
$li = new b();
$li-run();
echo 'hr';
var_dump($li);
输出:
var b
fun b
object(b)[1]
private 'var' = string 'var b br/' (length=11)
private 'var' (a) = string 'var a br/' (length=11)
.
.
var a
fun a
object(b)[1]
private 'var' = string 'var b br/' (length=11)
private 'var' (a) = string 'var a br/' (length=11)
.
————————————————————————————————
object(b)[1]
private 'var' = string 'var b br/' (length=11)
private 'var' (a) = string 'var a br/' (length=11)
这个时候,我们可以看到,在调用run方法时,首先它会调用到b类的私有属性$var 和私有方法m(),随后,又使用parent::run()调用父类的run()方法,我们可以看到,父类的run()方法调用后,它所调用的属性和方法,都是a类的两个私有属性和方法,这种形式,和你的问题一致;
而它与$this指向无关,我们可以在这里看到,两个$this都是指向b类。
而最有意思的是,在$li句柄中,我们却看到了两个属性!一个是b类的属性,一个是a类的属性,这两个属性同时存在着,那么,私有方法也自然是同时存在着。
【三】…………私有属性和方法能不能被继承…………
class a{
private $var = 'var a br/';
private function m(){
echo 'fun a br/';
}
}
class b extends a{
public function run(){
echo $this-var;
$this-m();
}
}
$li = new b();
$li-run();
输出:
Notice: Undefined property: b::$var in E: ... on Line 9
Fatal error: Call to private method a::m() from context 'b' in E: ... on Line 10
这可以证明,私有属性和方法,无法被继承,所以,你的代码示例中所说,将a类的m()方法更改为private后,会显示aa的属性,也就可以理解明白了。