我真的很喜欢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
但我不喜欢它,主要是因为你不能以标准的方式声明对象属性,并确保使脚本的执行速度变慢。我想要一个离线工作的方法,同时开发......一种编译。
答案 0 :(得分:9)
找另一种语言。
弱打字和JiT编译是PHP PHP的一部分。如果您认为PHP的特性违背了您的编码理念,那么请务必使用它。
还有其他语言,例如Ruby,它是强类型的,但是像PHP一样编译。
答案 1 :(得分:7)
有几种方法可以使代码更加严格。
在方法中使用类型提示来限制参数类型。这仅适用于类,接口和数组。见例:
class Foo { }
class Bar {
function quux(Foo $f) { }
}
我尽可能多地使用类型提示来避免愚蠢的错误,例如传递null或原始值,而对象是期望的。遗憾的是,返回值并非强类型。
使用访问限定符:public
,protected
,private
。虽然公共成员可以由外部实体访问,但受保护和私有只能通过相同(基础)类的实例访问。另请考虑使用abstract
和final
限定符。
针对接口而不是类的代码,积极地使用组合和聚合。习惯使用依赖注入。在适当的地方使用众所周知的设计模式。
熟悉反射和面向方面编程的元素。虽然在AoP领域提供的PHP很少,但它的反射子系统非常好。您可以在doc-block注释中使用@annotations来利用元编程。我经常使用它来注释具有单元测试位置的类。我还有一个ACL的实现,其中控制器方法用(长话短说)必要的访问级别注释:
/**
* @AclActivity('view-services')
* @AclActivity('edit-services')
*/
public function editServiceAction() { ... }
最后,不要局限于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
}