【问题标题】:How does php determine the needed internal type of a variable?php如何确定变量所需的内部类型?
【发布时间】:2015-04-21 22:19:54
【问题描述】:

这是一个关于 PHP 内部结构以及它在后台如何工作的问题:

php是如何决定的:

$a = 3;

需要是整数(内部)?

以及如何

$a = "3";

需要是字符串吗?

我曾经听说 PHP 使用强制转换每个变量(转换为不同的类型)来确定其所需的内部数据类型,但是在尝试验证此语句时,我无法在 Internet 上找到任何相关信息。

官方 PHP 文档中有一些奇怪的例子描述了该语言的一些奇怪行为:

来源:http://php.net/manual/en/language.types.type-juggling.php

<?php
$foo = "0";  // $foo is string (ASCII 48)
$foo += 2;   // $foo is now an integer (2)
$foo = $foo + 1.3;  // $foo is now a float (3.3)
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs";     // $foo is integer (15)
?>

但这并不能回答我的问题。

它只是以一种非常晦涩的方式展示了动态 PHP 是如何实现的。

我认为这与评估无关(例如“”:=false 但“abc”:=true),不是吗?

还有一个问题:php 如何从像“10 Small Pigs”这样的字符串中提取“原始”整数?这可以通过类型转换(内部)来完成,还是需要某种包含字符转换或其他东西的字符串处理?

【问题讨论】:

标签: php types casting internals


【解决方案1】:

PHP 会根据需要自动将值从一种类型转换为另一种类型。如果变量包含一个字符串,但您在算术表达式中使用它,它会将其转换为数字。如果它包含一个数字,但您将它用作需要字符串的函数的参数,它会将其转换为字符串。

当你进行比较时,如果两个值的类型不同,其中一个将被转换为另一种类型(除非你使用“严格”比较运算符,===!==)。 type comparison tables 说明会根据这两种类型进行转换。

当你做初始任务时,比如

$a = 3;
$b = "3";
$c = false;

它查看语法。如果值在引号中,那么它是一个字符串。如果该值是一个裸数字,则它是一个数字。所以$a 包含一个数字,$b 包含一个字符串。 $c 包含一个布尔值,因为它是从一个布尔文字分配的。

如果您使用函数调用分配变量,则取决于函数返回的内容(例如substr 返回字符串);所有标准 PHP 函数的返回类型都在文档中指定。

大多数情况下,它在所有这些情况下所做的是从语法和可能的语义上直观地看起来“正确”。

【讨论】:

  • 这确实是一件有趣的事情,但我猜它并没有回答我的问题:这并不能解释 如何 php 决定/确定变量需要的类型,当解释器运行到告诉$a=3 的行时。好的 PHP 会自动转换变量,但它如何知道要转换的类型?当你说“如果它包含一个字符串..”时,这真的可以那么容易吗? php是否仅通过引号确定变量是否需要在初始化时为字符串?这让我有些困惑
  • 我添加了一些简单作业的解释。
【解决方案2】:

对于第二个问题,您可以使用 intval。

来自 php.net,http://php.net/manual/en/function.intval.php

(PHP 4,PHP 5)

intval — 获取变量的整数值

int intval (mixed $var [, int $base = 10])

使用指定的基数返回 var 的整数值 转换(默认值为 10)。 intval() 不应用于 对象,因为这样做会发出 E_NOTICE 级别的错误并返回 1。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2010-09-28
    • 2017-01-05
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多