单纯的php开发者可能都不清楚java、c++,包括golang开始要支持的泛型,到底是什么,为什么在php圈子里没有什么人讨论泛型的问题?

看个论坛对话了解java泛型及为什么php不需要泛型:


天地炫舞 09:39:18

我先学习过java,然后又学习了PHP,在使用面向对象的思想编写的一个小例子的时候发现了一个问题,为何PHP不加入泛型技术,虽说PHP是弱语言类型,但是加入泛型的却会方便很多的啊,请看下面的例子:

interface Usb{
    function start();
}
class Upan implements Usb{
    function start(){
        echo "upan";
    }
}
class SDcard implements Usb{
    function start(){
        echo "sdcard";
    }
}
function useUU($u){
    $u->start();//这里如果加上泛型不是更加方便么
}
$upan=new Upan();
$sdcard=new SDcard();
useUU($upan);
useUU($sdcard);

天地炫舞 09:58:31

哈哈 和java一样啊

function useUU($u<Usb>){
    $u->start();//这里如果加上泛型不是更加方便么
}

这样的话,变量$u就可以直接调用start()方法了


天地炫舞 11:40:43

我认为这就是应用泛型技术应该解决的问题啊,当useUU()方法被调用的时候,泛型自动根据传入的参数实例化一个对象。

例如当传入的是upan对象时,泛型把变量$u实例化为upan对象,再来调用对应的方法。

在php代码底层应该也是这样操作的啊,当有对象传入的时候,变量$u获得upan对象的引用,再来调用upan对应的方法。增加泛型无非是在函数未被调用前,可以调用指定对象的方法。不要纠结这里定义的接口不能实例化啊,如果我把Usb改为一个类呢,我利用代码重写,子类重写父类方法,再利用多态的思想,根据传入不同的子对象,来调用不同的方法。


xuzuning 12:31:02

泛型只是允许多种类型(只要符合事先的约定) 实际上就是弱类型

但永远也不会无中生有


天地炫舞 12:49:02

给你一个java代码:

package com.wllfengshu;
interface Usb{
    void start();
}
class Upan implements Usb{
    public void start(){
        System.out.println("Upan");
    }
}
class SDcard implements Usb{
    public void start(){
            System.out.println("SDcard");
        }
    }
    public class Generi{
        public static void useUU(Usb u){
        u.start();
    }
    public static void main(String[] args) {
        Upan upan=new Upan();
        useUU(upan);
    }
}

并没有无中生有啊,我们不能说PHP现在设计的没有泛型,你就一直否定泛型啊。PHP虽说是若类型,但是如果能增加某种方法使之能在强弱之间自由切换,也就是增加强语言类型的功能,岂不是更好。


xuzuning 15:07:11

你这个代码和你主贴的php代码有什么区别呢?

无非就是没有把

function useUU($u){

写作

function useUU(Usb $u){

如果你原意加上类型限定,php 也是支持的,但这绝不是泛型,而是强制类型


天地炫舞 19:14:51

刚试了下,的确PHP可以这样使用,加上PHP又没有类似java中集合的概念,的确没有必要增加泛型,PHP还是学的太浅了,谢谢指教