请问php继承的类怎么调用php function returnn?

php类方法的调用与继承 - 开源中国社区
当前访客身份:游客 [
当前位置:
function __construct($host,$user,$pwd,$db,$table){
$this-&host=$
$this-&user=$
$this-&pwd=$
$this-&db=$
$this-&table=$
function conn(){
$connect=mysql_connect($this-&host,$this-&user,$this-&pwd) or die(&连接失败&);
class B extends A{
function select(){
mysql_select_db($this-&db,$this-&conn()) or die(&数据库选择失败&);
//return $
class C extends B{
function sql(){
$this-&select();
$sql=&select * from $this-&table&;
$result=mysql_query($sql) or die(&数据库查询失败&);
$rs=mysql_num_rows($result);
$conn=new C(&localhost&,&root&,&123456&,&q&,&student&);
var_dump($conn-&sql()); echo &&br&&;
var_dump($conn-&conn()); echo &&br&&;
var_dump($conn-&select()); echo &&br&&;
大神们,帮我解析一下这段代码吧,为什么function conn()必须有返回值$this-&conn()才不会失败;而function select()有没有返回值$this-&select()都能成功;调用的是父类方法整体还是返回值;如果是返回值第一个就好解释了返回的是一个资源类型,第二个是true怎么解释
共有1个答案
<span class="a_vote_num" id="a_vote_num_
mysql_select_db 返回的是一个布尔值,你有没有指定资源链接,默认会使用最后一个链接资源... 所以不存在成功与否,只要链接正确了。&mysql_select_db 都是true...
楼主应该多看看手册...
更多开发者职位上
有什么技术问题吗?
-0.0-的其它问题
类似的话题PHP 类的变量与成员,及其继承、访问(1/3)-Php常用代码-Php教程-壹聚教程网PHP 类的变量与成员,及其继承、访问(1/3)
本文章来详细介绍PHP 类的变量与成员,及其继承、访问与重写要注意问题,有需要的朋友可参考参考。
基于 PHP5.3
&PHP 的类及其实例:
class Myclass{
&& public $prop = 123;
$obj = new Myclass();
类的成员属性(属性的称呼相对于&方法&而言)包括类常量和类变量,其中类常量在定义时不可为空,类的属性在定义时如果被赋值,只能使用标量和数组,并且不能是表达式,因为类属性在编译期被初始化,PHP 在编译期不执行表达式。
1、成员的访问控制:
public:可以继承,可以在类的方法之外被访问 , 如 $obj-&
protected:可以继承,不可以在类的方法之外被访问
private:不可以继承,不可以在类的方法之外访问
PHP 4 使用 var 来声明类的属性,在PHP5之后不再使用,PHP5.3之前使用被警告,PHP5.3之后可以用在 public 之前或单独使用作为 public 的别名。
这三个访问控制关键字也可以修饰构造函数,当 private 和 protected 修饰类的构造函数时,你只能通过一个 publice static 的静态方法来调用构造函数以实例化对象,因为够在函数无法在类之外被访问了,比如,单例类的实现:
class Singleton {
&&& private static $instance=
&&& public $k = 88;
&&& private function __construct(){
&&& public static function getInstance(){
&&&&&&& if(self::$instance==null){
&&&&&&&&&&&&&&& self::$instance = new self();
&&&&&&& return self::$
&&& public function& __clone(){ //pretend clone oprationg
&&&&&&& throw('Singleton class can not be cloned');
&&&&&&& return self::getInstance();
//new Singleton();& // Error
$in = Singleton::getInstance();&&
2、继承禁止: final 关键字,仅用于修饰类或类的方法
如果一个类被 final 修饰,这个类不能被继承,如果一个方法被final 修饰,则这个方法不能被子类重写(override)。
class Myclass{
&& public $prop = 123;
& final public static function& methodA(){//不可继承的,公开的静态方法
&&&&&&& return 'this is a final method';
3、抽象类和抽象方法:abstract 仅用于 类和方法,抽象类不能直接用于实例化对象只能用于产生子类
abstract class Myclass{
&& public $prop = 123;
&& abstract public function& methodA(); //抽象方法没有实现函数体
上一页: &&&&&下一页:相关内容xtyang copyright&#169;,邮箱:php的继承方法获取子类名
看了一下datastore的入门,以及开始采用MVC方式来写php,于是想拿php为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.- php里__CLASS__这类东西是静态绑定的,如果不再子类里重载的话,那么继承父类方法所得到的依旧是父类的名
&#160;&#160;&#160;
看了一下datastore的入门,以及开始采用MVC方式来写php,于是想拿php为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.-
php里__CLASS__这类东西是静态绑定的,如果不再子类里重载的话,那么继承父类方法所得到的依旧是父类的名称而不是子类的名称。比如:
function __construct(){
echo __CLASS__;
static function name(){
echo __CLASS__;
class B extends A{}
此时无论将B实例化还是直接调用静态方法,echo出来的都会是A。翻qeephp里是用子类重载的方式解决这个问题,可是这样的话没新搞一个子类就得把相应调用类名的方法重载一边.....这算是php在oop上的缺陷吧,试了试python上没这个问题。
google之。找到两个函数get_class()和get_called_class()。get_class()用于实例调用,加入参数($this)可解决子类继承调用的问题,而get_called_class()则是用于静态方法调用,可是...这玩意儿只在php 5.3以后才有....5.3还是比较遥远的事...还好5.2之前可以手动实现这个函数:参阅http://php.net/manual/en/function.get-called-class.php 下方有高手添加了几种5.3之前的实现方式。
if(!function_exists('get_called_class')) {
class class_tools
private static $i = 0;
private static $fl =
public static function get_called_class()
$bt = debug_backtrace();
//使用call_user_func或call_user_func_array函数调用类方法,处理如下
if (array_key_exists(3, $bt)
&& array_key_exists('function', $bt[3])
&& in_array($bt[3]['function'], array('call_user_func', 'call_user_func_array'))
//如果参数是数组
if (is_array($bt[3]['args'][0])) {
$toret = $bt[3]['args'][0][0];
}else if(is_string($bt[3]['args'][0])) {//如果参数是字符串
//如果是字符串且字符串中包含::符号,则认为是正确的参数类型,计算并返回类名
if(false !== strpos($bt[3]['args'][0], '::')) {
$toret = explode('::', $bt[3]['args'][0]);
return $toret[0];
//使用正常途径调用类方法,如:A::make()
if(self::$fl == $bt[2]['file'].$bt[2]['line']) {
self::$i++;
self::$i = 0;
self::$fl = $bt[2]['file'].$bt[2]['line'];
$lines = file($bt[2]['file']);
preg_match_all('
/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
$lines[$bt[2]['line']-1],
return $matches[1][self::$i];
function get_called_class()
return class_tools::get_called_class();
于是现在可以把例子这么修改:
function __construct(){
echo get_class($this);
static function name(){
echo get_called_class();
class B extends A{}
这样就能让B直接顺利继承获取当前类名的方法了~
(责任编辑:PHP100er)
本文关键字:
广告赞助商
最新视频推荐
Copyright (C) 2007-, All Rights Reserved 版权所有 . 沪ICP备号
地址:上海徐汇区零陵路585号 爱邦大厦26H座
传真(FAX):021-
电话(Tel):021-
PHP100 Website Powered by PHPCMS. For PHP100. 服务器维护:阿里巴巴-阿里云查看: 907|回复: 5
php 在类的方法中如何获取调用该方法的方法名称?
php 在类的方法中如何获取调用该方法的方法名称?
我现在有一个框架很符合你的需求.
1.页面链接大概是index.php?act=goods.main,在index.php页面会获取act参数,通过list($ctrl,$fun)=explode(',',$_GET['act']);
2.$m=new goods($ctrl,$fun);你在Core_Controller类里定义两个变量ctrl和fun,定义Core_Controller的构造函数时作如下操作,$this-&ctrl=$$this-&fun=$
3,在 showTpl方法中就可得到模板文件名了,$this-&tpl=$this-&ctrl.'.'$this-&fun.'.html';
4.在goods类里你就直接调用showTpl方法,不用再传模板文件名了。
我很赞同的方法,其实你也可以在每个方法里传个当前方法的名过去,例如:
public function testAction() {
$this -& showTpl(__FUNCTION__);
发一个我用的类
* 动作对象基础类
abstract class MvcBaseAction
* 应用程序对象
* @var MvcAppEntry
* 动作名称
* @var string
* 当前请求
* @var MvcRequest
* 执行结果
* @var mixed
* 构造函数
* @param MvcAppEntry $app
* @param string $name
function __construct(MvcAppEntry $app, $name)
$this-&app = $
$this-&name = $
$this-&request = $app-&
* UDI 转 MVC Action 标识
static function parseUDI(array $udi){
& & // 剔除掉 :module
& & if ($udi[Router::operate] != Router::default_operate){
& && &&&return sprintf('%s.%s',$udi[Router::operate],$udi[Router::action]);
& & return $udi[Router::action];
* 执行动作
function __execute()
& & if (!$this-&__before_execute())
& & if ($this-&validate_input())
& && &&&$result = $this-&execute();
& && &&&if (!is_null($result)) $this-&result = $
& && &&&if (!$this-&validate_output())
& && && && &$this-&on_validate_output_failed();
& && &&&$this-&on_validate_input_failed();
& & $this-&__after_execute();
* 执行指定的视图对象
* @param array $vars
* @param string $viewname
function view(array $vars = null,$viewname=null)
& & if (!is_array($vars)) $vars = array();
& & $this-&result = $this-&app-&view($viewname ? $viewname : $this-&name, $vars);
* 应用程序执行的动作内容,在继承的动作对象中必须实现此方法
* 返回值会被保存到动作对象的 $result 属性中。
* @return mixed
abstract function execute();
* 继承类覆盖此方法,用于在执行请求前过滤并验证输入数据
* 如果返回 false 则阻止调用 execute() 方法,并调用 validate_input_failed() 方法。
* @return bool
function validate_input()
* 继承类覆盖此方法,用于在执行请求后过滤并验证输出数据
* 如果返回 false 则调用 validate_output_failed() 方法。
* @return bool
function validate_output()
* 请求前对数据进行验证失败时调用此方法
function on_validate_input_failed()
* 请求执行后对数据进行验证失败时调用此方法
function on_validate_output_failed()
* 执行动作之前调用,如果返回 false 则阻止动作的执行
* @return bool
protected function __before_execute()
* 执行动作之后调用
protected function __after_execute()
一个类只提供一个action标准方法,完全从类名中解析模板,也可结合一级或多级命名空间。
Powered by 一站到底 X3.2
& yizhandaodi}

我要回帖

更多关于 php function return 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信