首页 > 后端开发 > 正文

php 能定义多个相同名字的函数但是参数不同吗?

2024-07-19 20:49:06 | 我爱编程网

我爱编程网小编给大家带来了php 能定义多个相同名字的函数但是参数不同吗?相关文章,一起来看一下吧。

本文目录一览:

php 能定义多个相同名字的函数但是参数不同吗?

php 能定义多个相同名字的函数但是参数不同吗?

php不支持函数重载

但是可以配合其他的几个内置函数来实现这个功能
func_get_arg() 获取传入的参数
func_num_args() 获取参数数量

function getUser() {
$param = func_get_arg(0);
if(is_array($param)) {
...
} elseif(is_int($param)) {
...
} elseif(is_string($param)) {
...
} else {
...
}
}

php 能定义多个相同名字的函数但是参数不同吗?

PHP的SPL标准库的用法介绍

本文介绍下,php编程中SPL中的用法,SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,有需要的朋友参考下。

PHP SPL的用法

SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。

似乎众多的 PHP 开发人员基本没有使用它,甚至闻所未闻。究其原因,可以追述到它那阳春白雪般的说明文档,使你忽略了「它的存在」。SPL 这块宝石犹如铁达尼的「海洋之心」般,被沉入海底。而现在它应该被我们捞起,并将它穿戴在应有的位置 ,而这也是这篇文章所要表述的观点。

SPL 提供了什么?

SPL 对 PHP 引擎进行了扩展,例如 ArrayAccess、Countable 和 SeekableIterator 等接口,它们用于以数组形式操作对象。同时,你还可以使用 RecursiveIterator、ArrayObejcts 等其他迭代器进行数据的迭代操作。

它还内置几个的对象例如 Exceptions、SplObserver、Spltorage 以及 splautoloadregister、splclasses、iteratorapply 等的帮助函数(helper functions),用于重载对应的功能。

这些工具聚合在一起就好比是把多功能的瑞士军刀,善用它们可以从质上提升 PHP 的代码效率。那么,如何发挥它的威力?

重载 autoloader

如果你是位「教科书式的程序员」,那么你保证了解如何使用 __autoload 去代替 includes/requires 操作惰性载入对应的类,对不?

但久之,你会发现你已经陷入了困境,首先是你要保证你的类文件必须在指定的文件路径中,例如在 Zend 框架中你必须使用「_」来分割类、方法名称(你如何解决这一问题?)。

另外的问题:

当项目变得越来越复杂, __autoload 内的逻辑也会变得相应的`复杂。到最后,甚至你会加入异常判断,以及将所有的载入类的逻辑如数写到其中。

大家都知道「鸡蛋不能放到一个篮子中」,利用 SPL 可以分离 __autoload 的载入逻辑。只需要写个你自己的 autoload 函数,然后利用 SPL 提供的函数重载它。

例如,上述 Zend 框架的问题,你可以重载 Zend loader 对应的方法,如果它没有找到对应的类,那么就使用先前定义的函数。

复制代码 代码示例:

<?php

class MyLoader {

public static function doAutoload($class) {

// 本模块对应的 autoload 操作

}

}

spl_autoload_register( array('MyLoader', 'doAutoload') );

?>

spl autoload register 还能以数组的形式加入多个载入逻辑。同时,你还可以利用spl autoload unregister 移除已经不再需要的载入逻辑,这功能总会用到的。

迭代器

迭代是常见设计模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了所有你需要的对应数据类型的迭代器。

有个非常好的案例就是遍历目录。常规的做法就是使用 scandir ,然后跳过「.「 和 「..」,以及其它未满足条件的文件。例如你需要遍历个某个目录抽取其中的图片文件,就需要判断是否是 jpg、gif 结尾。

使用 SPL 的迭代器执行上述递归寻找指定目录中的图片文件的例子: 我爱编程网

复制代码 代码示例:

<?php

class RecursiveFileFilterIterator extends FilterIterator {

// 满足条件的扩展名

protected $ext = array('jpg','gif');

/**

* 提供 $path 并生成对应的目录迭代器

*/

public function __construct($path) {

parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));

}

/**

* 检查文件扩展名是否满足条件

* // www.jbxue.com

*/

public function accept() {

$item = $this->getInnerIterator();

if ($item->isFile() &&

in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) {

return TRUE;

}

}

}

// 实例化

foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) {

echo $item . PHP_EOL;

}

?>

php 能定义多个相同名字的函数但是参数不同吗?

php怎么方法重载

我爱编程网(https://www.52biancheng.com)小编还为大家带来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 能定义多个相同名字的函数但是参数不同吗?,希望能对大家有所帮助。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“php 能定义多个相同名字的函数但是参数不同吗?”相关推荐
php 同一个程序中不同脚本里能用相同的变量名吗
php 同一个程序中不同脚本里能用相同的变量名吗

php同一个程序中不同脚本里能用相同的变量名吗可以,但是你要确保这两个变量不会同时出现,比如在A文件中定义了$aa,在文件中也定义了$aa,同时A包含了B文件,这样就会出问题。不过如果变量有域的话就不会引起冲突了。比如某个函数里定义了$aa,同时函数外面也有$aa,但是他们不会冲突。php怎么去除重复的值在PHP中去除重复值的函数为array_unique()。此函数会从数组中移除

2025-01-12 18:11:37
PHP中不同文件夹使用相同的命名空间,相互之间应该如何调用呢?能不能举例说明一下。
PHP中不同文件夹使用相同的命名空间,相互之间应该如何调用呢?能不能举例说明一下。

Thinkphp空操作.空控制器.命名空间详解1、空操作空操作是指系统在找不到请求的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。网址/index.php/Home/Main/login网址/index.php/Home/Main/hello空操作出现页面:显示的错误信息过于详细,为安全以及优化页面起见

2024-12-06 18:14:52
【PHP】初始化是一定要用类的同名函数做构造函数吗?
【PHP】初始化是一定要用类的同名函数做构造函数吗?

请问PHP构造函数的含义php的两大oop使用型函数:构造函数(__construct)和析构函数(__destruct);构造函数:当在某一页面写了众多函数,其中就包括构造函数,当你调用其中任一函数时,都将在调用此函数前先调用构造函数,如:你把链接数据库代码写到构造函数里面,然后在使用增删改查时,就不用再写连接s数据库语句了,因为有构造函数在,你就只用写增删改查类sql语句就可以了。

2024-08-02 18:43:13
php数组循环,相同数值怎样只保留一个? array_unique定义和用法
php数组循环,相同数值怎样只保留一个? array_unique定义和用法

php数组循环,相同数值怎样只保留一个?数组的键值分别是什么?通用的思路在foreach循环输出中做判断日期相同的去掉,用一个新的数组去存储PHP数组去除重复项 有个内置函数array_unique (),但是php的 array_unique函数只适用于一维数组,对多维数组并不适用用php随机生成不重复的数字php基础教程:用php随机生成不重复的数字。?php$num=3

2024-09-01 12:41:12
uniqueidphp下判断数组中是否存在相同的值array_unique(PHP多维数组排序,用array_multisort函数对数组按指定字段排序)
uniqueidphp下判断数组中是否存在相同的值array_unique(PHP多维数组排序,用array_multisort函数对数组按指定字段排序)

uniqueidphp下判断数组中是否存在相同的值array_uniquearray_unique()函数在PHP中用于去除数组中的重复值,确保返回的新数组中不包含任何重复的元素。此函数保留数组中元素的键名不变,但在内部对值进行排序,仅保留首次遇到的键名。如果数组中的两个元素在字符串比较下相同,那么第一个元素将被保留。考虑以下实例:如果数组包含"a"=&gt;"green","red"

2025-02-23 01:05:53
如何将PHP表单提交实现提交到多个表的不同字段?
如何将PHP表单提交实现提交到多个表的不同字段?

如何将PHP表单提交实现提交到多个表的不同字段?如果您想在PHP表单中实现提交到多个表的不同字段,可以使用如下步骤来实现:在表单中定义相应的字段,用于获取用户输入的数据。使用PHP代码从表单中获取用户输入的数据。使用PHP中的数据库操作函数(例如MySQLi或PDO),连接到数据库,并且向不同的表插入数据。例如,如果您想插入用户名和电子邮件到user

2024-08-18 21:12:02
PHP中编写一个函数找出k以内最大的10个不足10个则是所有能被13整除但是不能被17整除的自然数?(用PHP定义一个函数,返回3个参数中的最大值?)
PHP中编写一个函数找出k以内最大的10个不足10个则是所有能被13整除但是不能被17整除的自然数?(用PHP定义一个函数,返回3个参数中的最大值?)

PHP中编写一个函数找出k以内最大的10个不足10个则是所有能被13整除但是不能被17整除的自然数?可以使用range函数来创建一个包含指定范围内的整数序列的数组,然后使用array_filter函数来过滤数组中满足特定条件的元素,最后使用array_slice函数来从数组中取出前10个元素。示例代码如下:==============functiongetNumbers($k){

2024-09-03 11:09:59
php如何统计一个数组中相同元素的个数
php如何统计一个数组中相同元素的个数

php如何统计一个数组中相同元素的个数简单的循环即可,选出重复(出现次数大于等于2)的元素并统计每个重复元素出现的次数:php中的array_count_values()函数可以实现array_count_values()函数用于统计数组中所有值出现的次数。本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。array_count_valu

2024-09-07 08:56:28