在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 父类调用子类方法和成员的更多相关文章

  1. PHP面向对象-看父类调用子类方法

    大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...

  2. java 多态 ---父类调用子类方法

    package test1;//多态的体现import javax.print.attribute.standard.RequestingUserName;import java.util.Scann ...

  3. Java父类与子类方法调用顺序

    父类 FatherClass package 父类与子类方法调用顺序; /** * 父类 * @author shundong * */ public class FatherClass { priv ...

  4. Java 多态 父类和子类方法的访问控制权限

    Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...

  5. php面向对象编程 父类调用子类编程

    使用父类调用子类的实现代码

  6. 多态&&父类调用子类特有的方法

    /* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调 ...

  7. java反射与多态(父类调用子类)的代码演示

    package Test0817; import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method ...

  8. Python父类调用子类

    首先说明,上面的标题其实是不正确的,Python是一门解释型.动态数据类型的高级语言,运行时,动态判断调用对象,其实还是子类自己在调用自己的方法或属性. 举个例子(copy过来的):SocketSer ...

  9. 父类调用子类的常量 lumen查询数据库方式

    我要在一个基类里面实例化所有的model 要根据集成的对象定义的model实例化 BaseRepository.php <?php namespace App\Repository; class ...

随机推荐

  1. VB6.0快捷键大全(转)

    窗体设置,控件布局时用: alt+v+x可以快速显示出工具框 Alt+P+N 引用 ctrl+左右键头可以移动控件 shift+左右键头调整控件大小 F7   切换到编辑窗口 Shift+f7 切换代 ...

  2. C#中WebClient使用DownloadString中文乱码的解决办法

    原文:C#中WebClient中文乱码的解决办法 第一次尝试: string question = textBox1.Text.ToString(); WebClient client= new We ...

  3. MultiView空间例子

    CSS代码: body { font-size:11pt; font-family:宋体; } .mainTitle { font-size:11pt; font-weight:bold; font- ...

  4. Flex 事件机制

    使用ActionScript的单击事件示例 <?xml version="1.0" encoding="utf-8"?> <s:Applica ...

  5. CSDN资源页面挂掉了?

    想上传几个文件,结果打不开了

  6. HDU-4866-Shooting(函数式线段树)

    Problem Description In the shooting game, the player can choose to stand in the position of [1, X] t ...

  7. PHP程序猿必须学习的第二课——站点安全问题预防

    作为PHP程序猿.第一课我们学习了基本的语法.那么在熟悉基本的语法之后我们应该学些什么呢?我觉得是安全问题.安全问题基于一个站点宛如基石,一着不慎,意味着灾难性的事故. 这里主要就提三点最简单,也是最 ...

  8. Enze frist day

    今天是我来到云和学院正式开班上课的第一天,我选择学习的科目是.net.因为.net我在学校的时候接触过一些,所以我想要更加深入的去学习.我觉得一个学生在学习上最怕的是没有遇到一位负责任的好老师,但幸运 ...

  9. Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型

    Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framewo ...

  10. beta分布

    http://blog.csdn.net/sweetrryy/article/details/6436358