Php 类型安全语言是否需要静态类型?

Php 类型安全语言是否需要静态类型?,php,programming-languages,type-safety,dynamic-typing,static-typing,Php,Programming Languages,Type Safety,Dynamic Typing,Static Typing,我试图理解一种语言的类型安全意味着什么。在动态类型化语言中,类型检查是在运行时执行的,例如,如果我运行以下PHP代码: <?php class MyClass { } // Create a MyClass instance $mc = new MyClass(); // Create an int variable $i = 1234; // Add $mc and $i $result = $mc + $i; ?> 我将得到一个错误,因为+运算符不支持MyClass

我试图理解一种语言的类型安全意味着什么。在动态类型化语言中,类型检查是在运行时执行的,例如,如果我运行以下PHP代码:

<?php
class MyClass
{ 
}

// Create a MyClass instance
$mc = new MyClass();

// Create an int variable
$i = 1234;

// Add $mc and $i
$result = $mc + $i;
?>

我将得到一个错误,因为
+运算符
不支持
MyClass
数据类型。因此,基本上类型检查是在运行时执行的


类型安全性是否意味着无论是在编译时还是在运行时执行类型检查,都要执行类型检查,还是意味着类型检查只能在编译时执行,因此每个变量都必须显式地指定一个数据类型(如C、Pascal、Java等)答案是否定的。Python是一种动态但强类型的语言:

>>> "foo" + 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
这是通过。

类型安全”通常意味着“内存类型安全”,也就是说,不能将包含一种类型的内存视为另一种类型

根据这个定义,大多数高级语言(包括动态类型语言)都是类型安全的,因为任何错误使用类型的尝试都会导致其中的错误(编译时或运行时)

P>这样,类型安全问题对于低级语言尤其是C和C++来说是一个问题。这些问题通常涉及指针或强制转换(例如C++中的重新解释强制转换)

C#是介于这两个组之间的一个有趣的例子:默认情况下它是类型安全的,但您可以使用
unsafe
关键字(通常出于性能或互操作原因)关闭部分代码的类型安全



但如果将类型安全与静态类型结合起来,并不一定意味着必须编写类型。许多静态类型安全语言,特别是函数式语言,或受其启发的语言,都使用。这意味着编译器可以根据分配给变量的内容自行确定变量的类型,因此您不必键入它。这是C++中的<代码> Auto <代码> > C中的代码> var >代码> ./p>对于这种特殊情况,有某种类型的安全性,但如果你说“代码>函数x()){ i=0;如果(真){$i=“BLA”;}返回$i;}…BTW.则没有。您的exmaple将导致1235,因此没有安全性well@RoyalBg如果一种语言在运行时执行类型检查,并在发现类型错误时停止程序,那么这种语言称为类型安全语言吗?很可能不是。在一些论文中,您可能会发现这些语言是有限类型安全语言,或者是有限上下文中的类型安全语言。对我来说,没有类型安全性,如果你可以将它隐藏在
if()
blockC中,它就不是完全类型安全的。如果是的话,它就不会有那么多未定义的行为。C#不一定是静态的强类型,但它被认为是类型安全的。但话说回来,如果你不想的话,也不必这样。Java被设计为类型安全的,但是仍然有一系列的异常,如果类型系统让您失望,您必须抛出/处理这些异常(
BigDecimal.divide
NullPointerException
,…)如果没有静态声明,Haxe如何知道编译类型的变量的数据类型,我只需更改
if
块中的数据类型,就可以知道编译时的数据类型。@Steve:在某个时候,您必须给变量赋值,这就是Haxe推断其类型的地方。您还可以将变量声明为动态变量,就像在Python中一样。请看我的意思是,如果Haxe在编译时执行类型检查,并且它还支持在不显式指定其数据类型的情况下创建变量,这意味着我可以创建一个if块,在运行时更改变量的数据类型,然后在不支持此新更改的数据类型的语句中使用此变量。例如:VarI=123;如果(某物)i=newmyclass();var结果=i+其他变量;这就像是静态声明变量,但实际上没有指定数据类型!在这种情况下,我不认为这是一条正确的语句:“编译时类型安全语言,它仍然不要求静态声明类型”,我不认为编译时类型安全语言可以允许在运行时更改数据类型。类型安全不是问题,因为它可以防止您犯错误,并帮助您确保您知道自己在做什么(PHP就像用您不知道的配料烹饪)。在我个人看来,类型安全语言中的类型推断是不好的,因为它会让你很容易失去对变量类型的概述。嗯,你不知道吗?然后是几十年后不得不扩展或更改代码块的人。
class Test {
    static function main() {
        trace(10 * Test.some());
    }

    static function some() {
        return "foo";
    }
}

> Build failure
> Test.hx:3: characters 19-30 : String should be Int