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 ...
随机推荐
- 关于Delphi中二维数组的声明和大小调整(对非基本类型数据,小心内存泄漏)
这是一个实例: procedure TMainForm.Button1Click(Sender: TObject);var arr:array of array of string;begin s ...
- 在OSX狮子(Lion)上安装MYSQL(Install MySQL on Mac OSX)
这篇文章简述了在Mac OSX狮子(Lion)上安装MySQL Community Server最新版本v10.6.7的过程. MySQL是最流行的开源数据库管理系统.首先,从MySQL的下载页面上下 ...
- 开源流媒体处理库live555服务器端、客户端源代码分析总结
RTSP服务器端流程: 1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话. 首先创 ...
- 详解iOS开发之自定义View
iOS开发之自定义View是本文要将介绍的内容,iOS SDK中的View是UIView,我们可以很方便的自定义一个View.创建一个 Window-based Application程序,在其中添加 ...
- 多条件搜索拼接Sql语句
1. 如下实例: 1.1 如下图所示:[通过用户输入的数据拼接Sql搜索语句] 1.2 private void button2_Click( ...
- 【ActiveMQ】设置自动重连
<property name="brokerURL" value="tcp://localhost:61616"/> <property na ...
- 创建js对象和js类
//第一种定义方式 var person=new Object(); //创建了一个对象. person.name="tom"; //使用person对象对调用name属性,它的值 ...
- 我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)
shelve模块 shelve模块是pickle模块的扩展,可以通过key,value的方式访问pickle持久化保存的数据 持久化保存: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- docker 数据盘映射方案
docker run -itd -v /data/:/data1 centos bash // -v 用来指定挂载目录, :前面的/data为本地目录,:后面的/data1 为容器里的目录: dock ...
- cmake 学习笔记(三)
转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...