php 父类调用子类方法和成员
在C和C++里,父类都不允许调用子类的方法,但在php里可以。下面是一个调用的例子:
<?php
abstract class Animal
{
protected $name;
public function run()
{
echo 'Aniaml run';
$this->swim();
echo $this->fishNum;
}
} class Fish extends Animal
{
public $fishNum=10;
public function swim()
{
echo 'Fish swim';
}
}
$fish=new Fish();
$fish->swim();
$fish->run();
输出:
Fish swim
Aniaml run
Fish swim
10
我们在父类的run()方法里面调用了
$this->swim();swim是子类定义的方法(注意,我们并没有在父类中定义abstract function swim()),说明了这不是多态。
我们不仅调用了方法,还调用了成员,是ok的。 一篇文章:
PHP父类调用子类方法,CodeIgniter中DB的继承关系
先看几行代码:
class A {
private $b;
function __construct($a){
$this->b = $a;
}
function func1(){
var_dump($this->b);
}
function func2(){
$this->funcb();
}
}
class B extends A {
function funcb(){
var_dump("b");
}
}
$a = new B('a');
$a->func1();
$a->func2();
这几行代码是没有错误的,在父类中调用子类的方法,子类实例化之后可以正常工作。 CI的DB部分正是使用了这种方式来封装数据库操作。
CI的DB函数的写法正是先加载CI_DB_driver这个基类,然后检查active record是否开启,如果开启则
1 |
class CI_DB_active_record extends CI_DB_driver |
然后
1 |
class CI_DB extends CI_DB_active_record |
否则
1 |
class CI_DB extends CI_DB_driver |
最后在require相应数据库的driver,如mysql,
1 |
CI_DB_mysql_driver extends CI_DB |
在这几个类中,只有CI_DB_driver有构造函数且带一个参数;
DB函数中这样写的:
1 |
$driver = 'CI_DB_'.$params['dbdriver'].'_driver'; |
2 |
$DB = new $driver($params); |
$params正是传给CI_DB_driver的构造函数;
然后检查是否自动初始化:如果是
1 |
$DB->initialize(); |
而initialize方法位于CI_DB_driver类中,此方法调用了子类的方法:
1 |
$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect(); |
db_connect方法和db_pconnect方法是在相映数据库driver实现的。
如mysql的实现位于CI_DB_mysql_driver类中:
function db_connect()
{
if ($this->port != '')
{
$this->hostname .= ':'.$this->port;
}
return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
}
php 父类调用子类方法和成员的更多相关文章
- PHP面向对象-看父类调用子类方法
大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...
- java 多态 ---父类调用子类方法
package test1;//多态的体现import javax.print.attribute.standard.RequestingUserName;import java.util.Scann ...
- Java父类与子类方法调用顺序
父类 FatherClass package 父类与子类方法调用顺序; /** * 父类 * @author shundong * */ public class FatherClass { priv ...
- Java 多态 父类和子类方法的访问控制权限
Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...
- php面向对象编程 父类调用子类编程
使用父类调用子类的实现代码
- 多态&&父类调用子类特有的方法
/* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调 ...
- java反射与多态(父类调用子类)的代码演示
package Test0817; import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method ...
- Python父类调用子类
首先说明,上面的标题其实是不正确的,Python是一门解释型.动态数据类型的高级语言,运行时,动态判断调用对象,其实还是子类自己在调用自己的方法或属性. 举个例子(copy过来的):SocketSer ...
- 父类调用子类的常量 lumen查询数据库方式
我要在一个基类里面实例化所有的model 要根据集成的对象定义的model实例化 BaseRepository.php <?php namespace App\Repository; class ...
随机推荐
- TreeView控件例子
XmL文件代码: <?xml version="1.0" encoding="utf-8" ?> <Area> <Province ...
- CodeIgniter结合Bootstrap
CodeIgniter-Bootstrap结合了 cI和bootstrap的长处,一个专注于服务器端,一个专注于ui,这个把2个结合起来了.框架地址: http://www.andyhawthorne ...
- android sdk 下载缓慢的问题
原文地址:http://www.oschina.net/question/265039_173445#tags_nav 1.在Android SDK Manager Setting 窗口设置 HTTP ...
- 如何在同一系统中启动多个 TOMCAT
<Server port="8005" shutdown="SHUTDOWN"> 接受server关闭指令的port号.我们叫关闭指令port. & ...
- GDI+入门——带你走进Windows图形的世界
一.GDI+基础 1.GDI+简单介绍 GDI+是微软的新一代二维图形系统,它全然面向对象,要在Windows窗口中显示字体或绘制图形必需要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象, ...
- 面试之get和post(转)
总结1 表单提交中get和post方式的区别归纳如下几点: GET是从服务器上获取数据,POST是向服务器传送数据,GET 请求一般不应产生副作用.就是说,它仅仅是获取资源信息,就像数据库查询一样,不 ...
- 玩转Bootstarp(连载)
一.Bootstarp是什么? 简单.灵活的用于搭建WEB页面的HTML.CSS.JS的工具集 (基于HTML5和CSS3) 总结:简洁强大的前端开发框架,可以让WEB开发更迅速.更简单 二.如何使用 ...
- ThinkPHP - 登录模块,核心代码
/** * 登录成功 * @return [type] [description] */ public function checkLogin($data) { $user = M($this-> ...
- BZOJ 1639: [Usaco2007 Mar]Monthly Expense 月度开支( 二分答案 )
直接二分答案然后判断. ----------------------------------------------------------------------------- #include&l ...
- eclipse安装PyDev插件出错No software site found at jar:file:[离线包路径]!/. Do you wish to edit the location?
解决方法是直接将下载的离线包解压,得到plugins和features文件夹,放到Eclipse的dropins目录下.重启Eclipse,PyDev插件即可安装成功. 离线包下载地址:http:// ...