PHP类型提示到原始值?

| 我想知道是否可以通过一种类型提示的方法来期望原始类型? 像这样:
public function someMethod(string $str)
                         //^^^^^^
要么:
private function anotherMethod(int $num)
                             //^^^
用同样的方式:
private function otherMethod(Person $rambo)
                           //^^^^^^
这可能在php中吗?     
已邀请:
在PHP 7中,他们添加了以下内容:   类型声明允许函数在调用时要求参数为某种类型。如果给定的值类型不正确,则会生成错误:在PHP 5中,这将是可恢复的致命错误,而PHP 7将抛出TypeError异常。 参考: http://php.net/manual/zh-CN/functions.arguments.php#functions.arguments.type-declaration 当问到这个答案时,PHP 5是最新的,并表示以下内容:   PHP 5引入了类型提示。现在,函数可以将参数强制为对象(通过在函数原型中指定类的名称),接口,数组(自PHP 5.1起)或可调用(自PHP 5.4起)。但是,如果将NULL用作默认参数值,则将其用作以后任何调用的参数。      如果将类或接口指定为类型提示,则也允许其所有子级或实现。      类型提示不能与标量类型(例如int或string)一起使用。资源和特质也不被允许。 参考:http://php.net/manual/en/language.oop5.typehinting.php     
不。您无法为基本类型输入提示,因为PHP具有对基本类型的自动转换。参见http://bugs.php.net/bug.php?id=29508。除非PHP团队突然改变主意(这很可疑,他们很固执),否则这永远不会改变。     
是的,现在有可能, 经过长时间的讨论,到目前为止,关于标量函数参数和返回值的类型提示实施建议已获得最高投票数的批准,请查看详细信息: 标量类型提示包括声明函数参数和返回值的类型,这些值可以是int,float,string和bool类型。这使PHP运行时引擎可以检查传递给参数函数和返回值的值类型是否为预期的类型,以便发现最终的编程错误。 在过去的PHP版本中已经允许对对象,数组和可调用对象进行类型提示。 当前的实现引入了五个新的保留字:int,float,bool,string和numeric。这些在以前没有保留,因为转换是词法分析器中的特例。
Example :
function test(float $a) {
    var_dump($a); 
}

test(1); // float(1)
test(\"1\"); // float(1)
test(1.0); // float(1)
test(\"1a\"); // E_RECOVERABLE_ERROR
test(\"a\"); // E_RECOVERABLE_ERROR
test(\"\"); // E_RECOVERABLE_ERROR
test(1.5); // float(1.5)
test(array()); // E_RECOVERABLE_ERROR
test(new StdClass); // E_RECOVERABLE_ERROR
您还可以选择声明为可允许Scaler类型提示的源文件。该文件必须位于配置脚本的第一行,并且不能在同一文件的其他位置声明。
Like : declare(strict_types=1);
在运行时,当PHP引擎尝试返回值时,它将检查是否与声明的值不匹配,这将引发致命错误,例如, 致命错误:传递给增量()的参数1必须为整数类型,字符串为给定 借助声明的这一新功能,您可以通过检测由于将错误类型的值传递给函数而导致的早期编程错误来编写更强大的应用程序。 类型的自动更改也可能发生。例如,可以将int类型自动更改为float类型参数,
function test(float $x){
    var_dump($x);
}
test(10); // works fine
声明返回类型 我们可以声明返回类型,在函数声明的最后一个括号和第一个括号之间添加一个冒号,后跟期望的类型。 对于不返回任何值的函数,不应在返回类型声明部分添加任何内容。
function mustReturnInt(): int { ... }
function mustReturnString(): string { ... }
function mustReturnBool(): bool { ... }
function mustReturnFloat(): float { ... }
function doesNotReturnAnything() { ... }
更复杂的例子
declare(strict_types=1);  
class StrictTypesTestingClass {  
public function returnSameInt(int $value): int {   return $value;  }   
public function returnSameFloat(float $value): float {   return $value;  }  
public function returnSameString(string $value): string {   return $value;  }   
public function returnSameBool(bool $value): bool {   return $value;  } }  
$check = new StrictTypesTestingClass();  // calls that work  print $check->returnSameInt(10); 
print $check->returnSameFloat(10.0); 
print $check->returnSameString(\"test\"); 
print $check->returnSameBool(true) ? \'true\' : \'false\';  // calls that throw exceptions 
print $check->returnSameInt(\"10\"); 
print $check->returnSameFloat(\"10.0\"); 
print $check->returnSameString(10);
print $check->returnSameBool(\"true\");
弱类型检查和类型转换的行为:弱类型检查模式可以与声明clarify(strict_types = 0)一起使用;或没有严格类型声明。需要考虑以下几点: 对扩展或内置PHP函数的弱类型检查调用与以前的PHP版本具有相同的行为 新标量类型声明的弱类型检查规则与扩展或内置PHP函数的弱检查规则大部分相同。 NULL是一种特殊情况,目的是与类,可调用对象和数组的当前类型声明保持一致。缺省情况下,不接受NULL,除非它是一个参数并且显式指定为默认值NULL,例如:function sample(int $ a = NULL); 这种方法有很多优点。您将获得类型安全性。这意味着您最终可以静态分析代码!您可以检测到错误地从一个函数中获取字符串并将其作为整数传递给另一个函数的错误。对于我来说,每天使用PHP并将Java作为OOP语言参考的开发人员来说,这对PHP来说是一个巨大的进步。     
每个人都已经说过了,因为PHP不支持原语,所以您不能为原语键入提示。其背后的原因不仅与自动转换有关,还与社区反应有关。 到目前为止,我还记得2010年5月在PHP主干中添加了对标量类型提示的支持。但是由于社区的反馈,该功能并未纳入5.4版本。 对此存在一些争议。反对该更改的人认为,这种支持将与PHP的基本设计背道而驰。 PHP被认为是一种弱类型语言。从本质上讲,这意味着PHP不需要您声明数据类型。变量仍然具有与之关联的数据类型,但是您可以做一些根本性的事情,例如将字符串添加到整数而不会导致错误。 恕我直言:标量类型提示应该尽快添加到PHP中,这是我们所有人都需要的功能,我非常尊重PHP是弱类型语言,但是对于高端开发和生产,尤其是在OO上下文中,标量类型提示是必须的有。我们可以在PHP中同时拥有这两种选择,就像过程和OO一样。     
对的,这是可能的。 http://ru2.php.net/manual/ru/language.oop5.typehinting.php#83442 警告:原始手册中有错别字:缩小而不是资源 人们经常问标量/基本类型提示。这是我在MVC框架中使用的一类类,该类将通过使用自定义错误处理程序来启用类型提示。 注意:您应将此代码放在包含头文件中的所有其他代码之上,并且如果您使用的是set_error_handler()函数,则应注意它也会使用它。您可能需要链接set_error_handlers() 为什么? 因为人们讨厌使用is_ *函数来验证参数。 减少防御性编码器的冗余编码。 函数/方法是自定义的/有关所需输入的文档。 也.. 在PHP Internals板上关注有关PHP 6.0中的类型提示的讨论。
<?php

define(\'TYPEHINT_PCRE\', \'/^Argument (\\d)+ passed to (?:(\\w+)::)?(\\w+)\\(\\) must be an instance of (\\w+), (\\w+) given/\');

class Typehint
{

    private static $Typehints = array(
        \'boolean\'   => \'is_bool\',
        \'integer\'   => \'is_int\',
        \'float\'     => \'is_float\',
        \'string\'    => \'is_string\',
        \'resource\'  => \'is_resource\'
    );

    private function __Constrct() {}

    public static function initializeHandler()
    {

        set_error_handler(\'Typehint::handleTypehint\');

        return TRUE;
    }

    private static function getTypehintedArgument($ThBackTrace, $ThFunction, $ThArgIndex, &$ThArgValue)
    {

        foreach ($ThBackTrace as $ThTrace)
        {

            // Match the function; Note we could do more defensive error checking.
            if (isset($ThTrace[\'function\']) && $ThTrace[\'function\'] == $ThFunction)
            {

                $ThArgValue = $ThTrace[\'args\'][$ThArgIndex - 1];

                return TRUE;
            }
        }

        return FALSE;
    }

    public static function handleTypehint($ErrLevel, $ErrMessage)
    {

        if ($ErrLevel == E_RECOVERABLE_ERROR)
        {

            if (preg_match(TYPEHINT_PCRE, $ErrMessage, $ErrMatches))
            {

                list($ErrMatch, $ThArgIndex, $ThClass, $ThFunction, $ThHint, $ThType) = $ErrMatches;

                if (isset(self::$Typehints[$ThHint]))
                {

                    $ThBacktrace = debug_backtrace();
                    $ThArgValue  = NULL;

                    if (self::getTypehintedArgument($ThBacktrace, $ThFunction, $ThArgIndex, $ThArgValue))
                    {

                        if (call_user_func(self::$Typehints[$ThHint], $ThArgValue))
                        {

                            return TRUE;
                        }
                    }
                }
            }
        }

        return FALSE;
    }
}

Typehint::initializeHandler();

?>

An are some examples of the class in use:

<?php

function teststring(string $string) { echo $string; }
function testinteger(integer $integer) { echo $integer; }
function testfloat(float $float) { echo $float; }

// This will work for class methods as well.

?>
您得到图片了。     
基本类型不支持根据PHP文档类型提示。 但是,类和接口都支持它。 编辑:我忘了提到数组也支持。     
这是用于从传入参数中强制布尔值的简短语法。如果
$state
为真,则
$this->is_active
设置为真。对于所有其他类型的值,将其设置为false。
function set_active ( $state ) {
    $this->is_active = true === $state;
}
    
我猜您不需要PHP的类型提示,因为您已经获得了类型检查功能,例如is_bool(),is_string()等,因此您可以在实际对这些功能进行参数输入之前对其进行检查尽管将其用于检查数组和对象类型的方法要干净得多,但它还是一个参数。     

要回复问题请先登录注册