我曾经写过一种非常强大的类型语言,例如java。我需要告诉编译器我将放入什么类型的变量......例如......
public static void sayHello(String aName)
我可以确保用户将字符串传递给我... 但如果我使用php,我可以这样做......
function sayHello($aName)
我仍然可以调用sayHello,但我不知道param类型是什么......我可以让这个名字更具信息性:
function sayHelloWithString($aName)
但是我无法阻止用户向我传递一个int .....用户仍然可以将int传递给我......这可能会导致很多错误....我怎么能停下来?分享任何想法或经验?谢谢。
答案 0 :(得分:5)
不如何阻止用户传入int?
在php中,您可以检查is_string
,但当然,您将错过设置__toString
的对象,或隐藏的数字转换为字符串。
如果必须让您的程序在开发人员尝试不同的东西时痛苦地哭泣,您可以在更高版本的PHP中指定类型(即function foo(ObjectType $bar)...
)*
在大多数松散类型的语言中,您希望为主要类型设置后备:
在接受的内容中保持自由,对发送的内容要严格。
*类型提示不支持原始类型
答案 1 :(得分:2)
您可以使用以下方法检查他们传递的内容是否为字符串: http://php.net/manual/en/function.is-string.php
然后提供适当的错误处理。
答案 2 :(得分:2)
有几种方法可以解决这个问题......
array
和类名。1 - 要使用优秀的IDE实现#1,您可以对文档进行文档拦截:
/**
* Say hello to someone.
*
* @param string $aName
**/
public function sayHello($aName) {
2 - 要实现#2,请使用is_
方法..
public function sayHello($aName) {
if (!is_string($aName)) {
throw new ArgumentException("Type not correct.");
}
// Normal execution
3 - 你不能用你上面的方法做到这一点,但这样的事情......除了#2之外的同样会抛出一个致命的致命错误,而不是ArgumentException
。
public function manipulateArray(array $anArray) {
值得注意的是,除非您正在编写可公开使用的库代码,否则大部分内容都是无关紧要的。您应该知道您的方法接受了什么,如果您首先尝试编写高质量的代码,那么您应该请事先检查一下。
使用一个好的IDE(我推荐phpStorm一千次)你可以而且应该在任何地方利用DocBlocks来完成你的所有课程。它不仅在编写API和普通代码时有用,而且你可以用它来记录你的代码,如果你需要在6个月后查看代码怎么办,你可能不会记得它100%:-)
此外,你可以使用docblocks做更多的事情,而不仅仅是定义参数类型,查找它。
答案 3 :(得分:1)
function sayHello($aName) {
if (is_string($aName)) {
//string OK!
} else {
echo "sayHello() only takes strings!";
}
}
答案 4 :(得分:1)
在PHP中,您可以使用is_string函数检查已传递的变量是否为字符串:
<?php
if (is_string($aName)) {
echo "Yes";
} else {
echo "No";
}
?>
希望有所帮助。
答案 5 :(得分:0)
或者/另外/使用Type Casting将变量转换为所需类型
http://us3.php.net/manual/en/language.types.type-juggling.php
答案 6 :(得分:0)
您可以选择检查以确保参数的类型正确。但是,如果不是,那么值得考虑一下你会做什么。如果您只是要抛出一个异常,那么最好只假设它是正确的类型,并且当您不允许执行某些操作时抛出异常。如果您不打算将更多有用的信息添加到已经抛出的异常/错误中,那么首先检查它没有多大意义。
至于向用户提供您想要的类型的指示,我通常坚持将其包含在变量名称中:
function sayHello($aNameStr)
function addItems($itemList)
...etc...
这一点,加上合理的文档,意味着用户可以查看该函数并找出它们应该首先传入的内容。
答案 7 :(得分:0)
某些脚本语言有可以帮助您的工具。例如,perl中的use strict
需要在使用之前声明每个变量。但是,根据定义,语言仍然是弱类型的。
有时命名约定会有所帮助。例如,我们继承了旧的Fortran传统,即int变量的名称应该从i,j,k,l,m,n开始。此约定现在至少用于索引。