代码之家  ›  专栏  ›  技术社区  ›  Imran Qadir Baksh - Baloch

php中的默认超级类[重复]

  •  1
  • Imran Qadir Baksh - Baloch  · 技术社区  · 7 年前

    我一直在研究用于对象的代码,而不关心对象的类型。我想输入提示,正在编写的方法需要任何类型的对象,但遇到了一些困难。

    我试过 function myFunc (object $obj) function myFunc (stdClass $obj) 但当我试图传递对象时,这两个错误都会产生:

    可捕获的致命错误:传递给myClass::myfunc()的参数1必须是对象的实例,给定的是objectActualClass的实例

    同样的情况也发生在 stdClass

    我错过了什么?我认为所有未显式继承自另一个继承自的类的类 STD类 ,这意味着php中每个类的基类都是 STD类 . 不是这样吗?

    0 回复  |  直到 7 年前
        1
  •  45
  •   Abdullah    14 年前

    stdclass不是基类!php类不会自动从任何类继承。所有类都是独立的,除非它们显式地扩展另一个类。php在这方面不同于许多面向对象语言。

        2
  •  36
  •   GWed    11 年前

    最好的方法是创建一个退化的接口 Object . 退化接口意味着它没有定义的方法。

    interface Object {
    
       // leave blank
    
    }
    

    然后在基类中,可以实现 对象 .

    class SomeBase implements Object {
    
       // your implementation
    
    }
    

    现在可以根据需要调用函数

    function myFunc (Object $obj);
    
    myFunc($someBase);
    

    如果传递的对象继承自 对象 接口,将传递此类型提示。如果传入数组、int、string等,类型提示将失败。

        3
  •  12
  •   iainn    7 年前

    虽然只花了8年时间,但这很快就会实现:php 7.2引入了 object 类型提示! 在我写这篇文章的时候,它正处于RFC阶段,而且 is due to be released in November .

    更新,11月30日: PHP 7.2 has been released

    RFC: Object typehint

    Discussion

    这完全符合您的预期:

    <?php
    
    class Foo {}
    class Bar {}
    
    function takeObject(object $obj) {
        var_dump(get_class($obj));
    }
    
    takeObject(new Foo);
    takeObject(new Bar);
    takeObject('not an object');
    

    将导致:

    字符串(3)“foo”

    字符串(3)“bar”

    致命错误:未捕获类型错误:传递给TakeObject()的参数1必须是一个对象,给定字符串,调用…

    https://3v4l.org/Svuij

    这样做的一个副作用是 object is now a reserved word ,不幸的是,这使得上面@gaz_edge的现有解决方案 broken . 幸运的是,你要做的就是删除接口。

        4
  •  11
  •   Ben    12 年前

    尽管没有对象的类型提示,但可以使用:

    if (!is_object($arg)) {
        return;
    }
    
        5
  •  7
  •   NikiC    14 年前

    没有所有对象都从中扩展的基类。您应该删除typehint并在 @param 注释。

        6
  •  3
  •   Jon    14 年前

    在不要求接口的所有用户扩展指定类的情况下,没有任何内置机制可以做到这一点。但你为什么要这么做?所有对象类型有哪些共同点足以使它们适合于您的api?

    很可能你不会得到任何东西,即使你能像这样键入提示。另一方面,键入hinting参数以实现接口(例如 Traversable )会更有意义的。

    如果您仍然需要类似于类型提示的内容,那么最好用 is_object 在参数上。

        7
  •  2
  •   Ophidian    7 年前

    从php 7.2开始,这个特性现在已经实现了。现在可以为任何对象键入提示。

    function myFunc(Object $myObject) : Object {
        return $myObject;
    }
    

    你可以在 official documentation

        8
  •  1
  •   7ochem    8 年前

    Typehint stdClass 从php 5.3+开始工作(如果我没有错的话)。 下面是使用typehint的有效代码 STD类 构建:

    例子 test.php :

    class Test{
        function hello(stdClass $o){
            echo $o->name;
        }
    }
    
    class Arg2 extends stdClass{
        public $name = 'John';
        function sayHello(){
            echo 'Hello world!';
        }
    }
    
    $Arg1 = new stdClass();
    $Arg1->name = 'Peter';
    
    $Arg2 = new Arg2();
    $Arg2->sayHello();
    
    $test = new Test();
    
    // OK
    $test->hello($Arg1);
    $test->hello($Arg2);
    
    // fails
    $test->hello(1);
    

    打印输出:

    世界你好!
    彼得
    约翰

    可捕获的致命错误:传递给test::hello()的参数1必须是stdclass的实例,给定整数,在第32行的test.php中调用,在第5行的test.php中定义

        9
  •  -3
  •   Alon Eitan    14 年前

    你可以这样做:

    function myFunc ($obj)
    {
         if ($obj instanceof stdClass) { .... }
    }
    
    推荐文章