很多站长朋友们都不太清楚php重载重写,今天小编就来给大家整理php重载重写,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 php怎么打开重写 php重写URL的教程 2、 PHP构造器是不是不能重载? - PHP进阶讨论 3、 php怎么方法重载 php怎么打开重写 php重写URL的教程1. 找到apache的安装目录下的conf下的httpd.conf文件,打开文件修改
LoadModule rewrite_module modules/mod_rewrite.so这行代码,他前面有个#号,把#号删掉
2. 还是那个文件,打开,找到
代码如下 复制代码
<Directory />
Options FollowSymLinks ExecCGI Indexes
AllowOverride None
Order deny,allow
Deny from all
Satisfy all
</Directory>
这个节点,把None改为All. 3. 重启apache服务
4. 最关键的一点,在你得项目目录下创建.htaccess文件,文件没有名称,看上去只是后缀名
具体创建方法不能直接创建,先创建个txt文件(其他的也行),然后另存问,把名字改为.htaccess,并且选所有文件,创建好后,就要制定规则了。 在文件里写代码:
RewriteEngine on //on为打开,off为关闭
RewriteRule ([a-zA-Z]{1,})-([0-9]{1,}).html$ index.php?action=$1id=$2
([a-zA-Z]{1,})-([0-9]{1,}).html$是规则,index.php?action=$1id=$2是要替换的格式,$1代表第一个括号匹配的值,$2代表第二个,如此类推!
PHP构造器是不是不能重载? - PHP进阶讨论原帖由 于 2008-9-28 09:53 发表 [i][/url]重载:(overload)1.在同一个类中;(不单单是类中,普通函数也包括)2.方法名相同;3.参数个数或者参数类型不同(如果参数类型和个数相同,但是类型顺序不同也是重载!)4.与返回类型无关劳伦斯兄弟说得对,PH ... [/b]龙兄说对了关键的概念没弄清楚吧,名词与用途没有对上号。1、弄清概念:重载(overload)、重写(override)、继承(extends)2、PHP是弱类型,重载根据变量类型和个数不同而进行,所以只能模拟重载。3、PHP支持在继承类中重写(覆盖)方法。4、构造函数(_construct)可以被继承。
php怎么方法重载php面向对象(OOP)编程完全教程:12.重载新的方法
在学习PHP 这种语言中你会发现, PHP中的方法是不能重载的, 所谓的方法重载就是定义相同的方法名,通过“参数的个数“不同或“参数的类型“不同,来访问我们的相同方法名的不同方法。但是因为PHP是弱类型的语言, 所以在方法的参数中本身就可以接收不同类型的数据,又因为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的。所以在PHP里面没有方法重载。不能重载也就是在你的项目中不能定义相同方法名的方法。另外,因为PHP没有名子空间的概念,在同一个页面和被包含的页面中不能定义相同名称的方法, 也不能定义和PHP给我提供的方法的方法重名,当然在同一个类中也不能定义相同名称的方法。
我们这里所指的重载新的方法所指的是什么呢?其实我们所说的重载新的方法就是子类覆盖父类的已有的方法,那为什么要这么做呢?父类的方法不是可以继承过来直接用吗?但有一些情况是我们必须要覆盖的,比如说我们前面提到过的例子里面, “Person”这个人类里面有一个“说话”的方法,所有继承“Person”类的子类都是可以“说话”的, 我们“Student”类就是“Person”类的子类,所以“Student”的实例就可以“说话“了, 但是人类里面“说话”的方法里面说出的是“Person”类里面的属性, 而“Student”类对“Person”类进行了扩展,又扩展出了几个新的属性,如果使用继承过来的“say()”说话方法的话,只能说出从“Person”类继承过来的那些属性,那么新扩展的那些属性使用这个继承过来的“say()”的方法就说不出来了,那有的人就问了,我在“Student”这个子类中再定义一个新的方法用于说话,说出子类里面所有的属性不就行了吗?一定不要这么做, 从抽象的角度来讲, 一个“学生”不能有两种“说话”的方法,就算你定义了两个不同的说话的方法,可以实现你想要的功能,被继承过来的那个“说话“方法可能没有机会用到了,而且是继承过来的你也删不掉。这个时候我们就要用到覆盖了。
虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了。
代码
<?
//定义一个"人"类做为父类
class Person
{
//下面是人的成员属性
var $name; //人的名子
var $sex; //人的性别
var $age; //人的年龄
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name, $sex, $age)
{
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//这个人可以说话的方法, 说出自己的属性
function say()
{
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age;
}
}
class Student extends Person
{
var $school; //学生所在学校的属性
//这个学生学习的方法
function study()
{
echo "我的名子叫:".$this->name." 我正在".$this->school." 学习";
}
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
function say()
{
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."我在".$this->school."上学;
}
}
?>
上面的例子, 我们就在“Student”子类里覆盖了继承父类里面的”say()”的方法,通过覆盖我们就实现了对“方法”扩展。
但是,像这样做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就一条代码或是几条代码,比如说“Person”类里面的“say()”方法有里面有100条代码,如果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100条代码重写一次, 再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:
一种是使用父类的“类名::“来调用父类中被覆盖的方法;
一种是使用“parent::”的方试来调用父类中被覆盖的方法;
代码
class Student extends Person
{
var $school; //学生所在学校的属性
//这个学生学习的方法
function study()
{
echo "我的名子叫:".$this->name." 我正在".$this->school." 学习";
}
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
function say()
{
//使用父类的"类名::"来调用父类中被覆盖的方法;
// Person::say();
//或者使用"parent::"的方试来调用父类中被覆盖的方法;
parent::say();
//加上一点自己的功能
echo "我的年龄是:".$this->age."我在".$this->school."上学.";
}
}
现在用两种方式都可以访问到父类中被覆盖的方法,我们选那种方式最好呢?用户可能会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非常专业化的时候尤其是这样。 不要用代码中父类文字上的名字,应该用特殊的名字 parent,它指的就是子类在 extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继承树在实现的过程中要修改,只要简单地修改类中 extends 声明的部分。
同样,构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。
代码
class Student extends Person
{
var $school; //学生所在学校的属性
function __construct($name, $sex, $age, $school)
{
//使用父类中的方法为原有的属性赋值
parent::__construct($name, $sex, $age);
$this->school=$school;
}
//这个学生学习的方法
function study()
{
echo "我的名子叫:".$this->name." 我正在".$this->school." 学习";
}
//这个人可以说话的方法, 说出自己的属性
function say()
{
parent::say();
//加上一点自己的功能
echo "我的年龄是:".$this->age."我在".$this->school."上学.";
}
}
关于php重载重写的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php重载重写 php重载和重写的详细内容...