如何使PHP更加Javatized(又名强类型,更强大)?

时间:2010-12-16 23:54:26

标签: java php

我真的很喜欢PHP因为:
_易于开发Web应用程序(您可以在10分钟内设置LAMP并准备好了)
_易于学习
_易于部署(您只需要使用带有PHP模块的Apache)

我真的很喜欢Java,因为:
_它是强类型的

我对Java和Netbeans的开发感到惊讶。任何时候出现类型不匹配的问题,IDE在开发过程中都会收到警报,而IDE本身也在建议修复。

我认为强打字是一种幸福。这是真的:可以包含任何内容的PHP数组可以加速您的开发,但是您必须花时间查找错误,而在提前做更多工作时,您可以使用IDE为您指出问题。 这让我在重构过程中也更有信心。

所以,我的问题是:是否可以在PHP中使用类型(包括方法的返回值)? 你知道一个项目,一个分叉,还有什么可以让我这么做的? 它可能只是一个预解析器,它在实际的PHP解析器之前检查一些注释(即public function /*ConfBuilders[]*/ getConfBuilders(/*int*/ confId)) 请介绍类型概念的任何内容,因此,在我看来,会使PHP应用程序更加健壮,并最终更快地实现(现在我认为用Java开发软件比用PHP开发软件更快,这要归功于IDE的帮助。)

谢谢,

编辑: 这是我在网上找到的唯一一件事:
http://cstruter.com/blog/44 但我不喜欢它,主要是因为你不能以标准的方式声明对象属性,并确保使脚本的执行速度变慢。我想要一个离线工作的方法,同时开发......一种编译。

4 个答案:

答案 0 :(得分:9)

找另一种语言。

弱打字和JiT编译是PHP PHP的一部分。如果您认为PHP的特性违背了您的编码理念,那么请务必使用它。

还有其他语言,例如Ruby,它是强类型的,但是像PHP一样编译。

答案 1 :(得分:7)

有几种方法可以使代码更加严格。

  1. 在方法中使用类型提示来限制参数类型。这仅适用于类,接口和数组。见例:

    class Foo { }
    class Bar {
        function quux(Foo $f) { }
    }
    
  2. 我尽可能多地使用类型提示来避免愚蠢的错误,例如传递null或原始值,而对象是期望的。遗憾的是,返回值并非强类型。

    1. 使用访问限定符:publicprotectedprivate。虽然公共成员可以由外部实体访问,但受保护和私有只能通过相同(基础)类的实例访问。另请考虑使用abstractfinal限定符。

    2. 针对接口而不是类的代码,积极地使用组合和聚合。习惯使用依赖注入。在适当的地方使用众所周知的设计模式。

    3. 熟悉反射和面向方面编程的元素。虽然在AoP领域提供的PHP很少,但它的反射子系统非常好。您可以在doc-block注释中使用@annotations来利用元编程。我经常使用它来注释具有单元测试位置的类。我还有一个ACL的实现,其中控制器方法用(长话短说)必要的访问级别注释:

      /**
       * @AclActivity('view-services')
       * @AclActivity('edit-services')
       */
      public function editServiceAction() { ... }
      
    4. 最后,不要局限于PHP。阅读其他语言,不仅是主流语言,还有模糊不清的语言 - 这些都充满了精彩的想法。查看Lisp,Erlang,Rebol。查找现有语言的不寻常应用程序,例如服务器端JavaScript编程。写自己的语言。是的,它会很糟糕,但你会学到很多东西。

答案 2 :(得分:1)

你有没有看过Eclipse?它是一个非常强大的Java和PHP IDE。同样,它还允许您在注释中定义类型。当然它不稳固......但代码提示确实有帮助。

 /**
 * Create a Person
 *
 * @param   string  $name
 * @param   int $age
 * @return  String
 */
function person($name, $age) {
    $this->name = $name;
    $this->age= $age;
    return "Hello ".$name;
}

答案 3 :(得分:0)

差不多十年前,我写了OP提到的帖子,在那篇文章中我实施了一个非常粗略的解决方案,它基本上使用魔术方法伪造强类型(我同意,并非那么棒)但是在最新版本的PHP中,事情发生了一些变化。

PHP不会(我敢说)成为强类型语言,但我相信在不久的将来它可能会成为逐渐类型化的语言(如TypeScript )

从PHP 7.x开始,可以声明函数的返回类型和声明/提示标量类型。

class Person
{
    private $age;
    public function __construct(int $age) {
        $this->age = $age;
    }
    public function getAge() : int {
        return $this->age;
    }
}

这个等式中仍然缺少的唯一部分(使PHP逐渐输入)是声明属性类型的能力,但是这已在recent draft document中提出。

class Person
{
    public int $Age; // Not possible yet
}

摘自http://cstruter.com/blog/410