向大家请教PHP的类的问题,关于PHP的重载。

myblessu 2003-10-27 08:38:21
有下面一段很简单的代码。

<?php

class A{
var $name1="abc";
var $name2;

function A(){
$this->name2="";
}

function A($aa){
$this->name2=$aa;
}

function show(){
echo "show() is running.<br>";
echo "this->name1=".$this->name1."<br>";
echo "this->name2=".$this->name2."<br>";
}
}

$B=new A("123");
$B->show();

?>

在不同的系统上,有点可以运行,有的不行。

我在下面的几台机子上试过是可以运行的。配置如下。

  A、redhat8.0 + Apache/2.0.40 + PHP/4.2.2
  B、win2000 + Apache/1.3.22 + PHP/4.2.1
  C、NT 4.0 +IIS/4.0 +PHP/4.0.6
 
  运行得到如下的结果:

  show() is running.
  this->name1=abc
  this->name2=123


而在下列一些系统上则不能运行。配置如下。
  A、FreeBSD + Apache/1.3.28 + PHP/4.3.3
  B、win2000 + Apache/1.3.28 + PHP/4.3.3 + Resin/3.0.3
  C、win2000 + Apache/2.0.46 + PHP/4.3.3
  D、win2000 + Apache/2.0.43 + PHP/4.3.2 + Tomcat/4.1

  运行得到如下错误提示。
  Fatal error: Cannot redeclare a() in D:\website\class.php on line 11


啊,想不通,为什么会是这样,这是什么道理,各位知道怎么解决吗?

这段代码在各位的系统上是否能运行,请告知系统配置情况(告知有分)。谢谢!



附:我的一个供大家试验的空间。
这是我的机子,只供大家验证,就是上面运行出错的B的配置,请不会攻击我的机子:

URL:http://icoming.vicp.net/

FTP:icoming.vicp.net
user:test
pass:test











...全文
311 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyw5257 2003-10-28
  • 打赏
  • 举报
回复
设置错误级别应该就没事吧
NightKids 2003-10-28
  • 打赏
  • 举报
回复
有时候还是挺好用的比如
如果这个操作类开始就要连接
$dbc= new MySQLOP();
$dbc= new MySQLOP("localhost");
$dbc= new MySQLOP("localhost","user",);
$dbc= new MySQLOP("localhost","user","password");
$dbc= new MySQLOP("localhost","user","password",3333);
不过我比喜欢
$dbc= new MySQLOP(); //这时候并没有连接
$dbc->host="localhost";
$dbc->user="user";

//设置好属性之后才
$dbc->connect();
ustb 2003-10-28
  • 打赏
  • 举报
回复
我试过在派生类中对基类的方法进行重载,php对此还是支持得很好的。至于在同一个类中,没有试过。想不出这样做是否有必要。
NightKids 2003-10-28
  • 打赏
  • 举报
回复
从内部来看确实不支持真正的重载~~~
其实说到底~一般情况下的 web 开发并不需要那些特性。
xuzuning 2003-10-28
  • 打赏
  • 举报
回复
是的。重载至少包括
1、类的方法的重载
2、函数的重载
3、运算符的重载

php只实现了1。试用了php5,也没有增加。
myblessu 2003-10-28
  • 打赏
  • 举报
回复
NightKids(喜欢一个人) :你那不应该叫重载.

现在只是清楚一点.PHP没有支持实际意义上的重载.
xinyaoxp 2003-10-28
  • 打赏
  • 举报
回复
学习
xuzuning 2003-10-28
  • 打赏
  • 举报
回复
只有版本低于4.3.0才可做此测试
<?php

class A{
var $name1="abc";
var $name2;
var $name3;


function A(){
$this->name3="ppp";
}
function A($aa){
$this->name2=$aa;
}
}

$B=new A("123");
print_r($B); //out a Object ( [name1] => abc [name2] => 123 )
$B = new A(); //out Warning: Missing argument 1 for a() in D:\InetPub\books\users\ide\tmp_ide.php on line 12

?>
<?php

class AA{
var $name1="abc";
var $name2;
var $name3;

function AA($aa){
$this->name2=$aa;
}
function AA(){
$this->name3="ppp";
}
}

$B=new AA("123");
print_r($B); //out aa Object ( [name1] => abc [name3] => ppp )
$B = new AA();
print_r($B); //out aa Object ( [name1] => abc [name3] => ppp )
?>

bonniewater(陪你去看海)
函数、类不能重复定义,这是php的约定。

楼主
在类定义中重复定义同名方法这个做法本身是不对的,重载类的方法应在派生类中进行

php是弱类型语言,并有限度的允许函数的参数缺省;而且允许函数参数的个数超过定义的数目。
那么以参数个数和类型作为区别标志的“重载”的基础就没有了。
个人认为,php实际上把函数的“重载”融合到基本语法中了。重而简化了“重载”的概念。

另外,不要把php和java进行比较。因为他们不是一回事。
虽然两者都从c语言演化而成。但由于目标不一样,造成无论是表述方式还是实现机制都有很大的差异。
NightKids 2003-10-28
  • 打赏
  • 举报
回复
php4 的重载,用了一年多了~感觉挺好的,没什么问题。
<?php
############################
#PHP 重载
############################
class 测试类{
//================================
function 测试类(){//构造函数
$参数个数 =func_num_args();
$参数列表 = func_get_args();
switch ($参数个数){
case 0: $this->构造函数0(); break;
case 1: $this->构造函数1($参数列表[0]);break;
case 2: $this->构造函数2($参数列表[0],$参数列表[1]);break;
case 3: $this->构造函数3($参数列表[0],$参数列表[1],$参数列表[2]);break;
}
}
//=============Function End ===========
//================================
function 构造函数0(){
printf("我是构造函数0");
}
//=============Function End ===========
//================================
function 构造函数1($参数1){
printf($参数1);
}
//=============Function End ===========
//================================
function 构造函数2($参数1,$参数2){
printf($参数1.$参数2);
}
//=============Function End ===========
//================================
function 构造函数3($参数1,$参数2,$参数3){
printf($参数1.$参数2.$参数3);
}
//=============Function End ===========
}

$测试 = new 测试类();
echo "<br>";
$测试1 = new 测试类("这是2吧!"," 是2不错");
echo "<br>";
$测试2 = new 测试类("这是2吧!"," 是2不错!"," 错~~是3");
echo "<br>";
############################
?>
bluemeteor 2003-10-28
  • 打赏
  • 举报
回复
一直对PHP中的类的功能使用不多,只局限于写过几个翻页类/购物车/菜单类等等入门级的东西

这些简单的class还并没有涉及到需要多态的地步,所以觉得重载在PHP4中尚无多大可用之处(个人之见)

function A($aa=""){
$this->name2=$aa;
}

楼主也可以实现 但是这毕竟不是真正的重载 期待PHP5
chqiang 2003-10-28
  • 打赏
  • 举报
回复
不好意思,重载是什么意思?是重新定义函数吗?
我的机子是:
win2000
apache 1.3.9
php 4.3.0
mysql
Fatal error: Cannot redeclare a() in c:\apache\htdocs\test\text-05.php on line 11

myblessu 2003-10-28
  • 打赏
  • 举报
回复
与java的用法怎相差这么远,对PHP越来越不明白了......

xuzuning(唠叨),能不能取个简单的例子?
bonniewater 2003-10-28
  • 打赏
  • 举报
回复
win2000 + Apache/1.3.28 + PHP/4.3.2

Fatal error: Cannot redeclare a() in d:\phptext\test9.php on line 10

按唠叨老大所说,把两个function A上下对调一下,还是这个错!
bluemeteor 2003-10-28
  • 打赏
  • 举报
回复
win2k
apache
PHP Version 4.3.1

Fatal error: Cannot redeclare a() in d:\phpweb\crm0530\class.php on line 11
xuzuning 2003-10-28
  • 打赏
  • 举报
回复
应该想得通。
php4.3.2中也是这个重复定义错。
php支持类的方法的重载,但不支持函数的重载。
在较前的版本中,类定义中允许同名方法存在。这实际上是个错误。
并且同名方法也只有最后定义的有效。
你把两个function A上下对调一下就可以看到
myblessu 2003-10-28
  • 打赏
  • 举报
回复
不能光up呀,ding呀,可不可以花你一点宝贵时间,在你机子上试试是什么结果?
ustcfrank 2003-10-28
  • 打赏
  • 举报
回复
ding
liftblood 2003-10-27
  • 打赏
  • 举报
回复
up

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧