7
回答
PHP 语言设计的疑问
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

我在学习 PHP 的时候有几个疑问:

1. 变量不经声明直接使用,这会让我拼写错误的变量名称正常使用,如何避免这样的问题?

2. 在函数内定义的函数是不是不支持?

3. PHP 能否支持闭包。

4. PHP 是不是不支持块级作用域。

5. PHP 是不是不能分辨一个关联数组是列表还是哈希?

6. PHP 用关联数组模拟的哈希是不是会丢失数据插入的顺序?

PHP
举报
Iolanguage
发帖于3年前 7回/396阅
共有7个答案 最后回答: 3年前
 

1. 变量不经声明直接使用,这会让我拼写错误的变量名称正常使用,如何避免这样的问题?
>>> 利用编辑器来帮助减少错误

2. 在函数内定义的函数是不是不支持?
>>> 不支持. 不过支持包裹匿名函数

3. PHP 能否支持闭包。
>>> (某个版本开始)支持。

4. PHP 是不是不支持块级作用域。
>>> 不支持

5. PHP 是不是不能分辨一个关联数组是列表还是哈希?
>>> 不能。PHP的数组是数组和hash表字典的合体

6. PHP 用关联数组模拟的哈希是不是会丢失数据插入的顺序?
>>> 应该是不会的。根据插入顺序决定
http://www.laruence.com/2009/08/23/1065.html

  1. 用一个靠谱的IDE,例如PHPStorm
  2. php5.3之后引入了闭包,之前可以用create_function
  3. 5.3之后支持
  4. 貌似不支持
  5. 可以
  6. 不是

第二点举例:

function init(){
    if(!function_exists('array_column')){
        function array_column(){
            //some thing
        }
    }
}



针对第五点,可以用如下代码:

function isAssocArray($array) {
    return count(array_filter(array_keys($array), 'is_string')) > 0;
}



--- 共有 1 条评论 ---
Iolanguage看样函数内定义的函数是全局的。 3年前 回复
对于第一点,开启相应错误等级。
error_reporting(E_NOTICE);
echo $abc;

//$abc 未定义 这时候就会报错咯



引用来自“mark35”的评论

 

1. 变量不经声明直接使用,这会让我拼写错误的变量名称正常使用,如何避免这样的问题?
>>> 利用编辑器来帮助减少错误

2. 在函数内定义的函数是不是不支持?
>>> 不支持

3. PHP 能否支持闭包。
>>> (某个版本开始)支持。

4. PHP 是不是不支持块级作用域。
>>> 不支持

5. PHP 是不是不能分辨一个关联数组是列表还是哈希?
>>> 不能。PHP的数组是数组和hash表字典的合体

6. PHP 用关联数组模拟的哈希是不是会丢失数据插入的顺序?
>>> 应该是不会的。根据插入顺序决定
http://www.laruence.com/2009/08/23/1065.html

PHP 的变量要么是全局的,要么是函数内的局部变量,没有静态变量,也没有动态变量,看样如果多个函数共享一组数据,又不想污染全局变量命名空间的话,就只能把这组数据的引用当成参数传来传去。

PHP 的函数似乎不能动态的感知调用的 caller 环境。

--- 共有 5 条评论 ---
Iolanguage@eechen 这种使用全局变量的做法看似是不错的解决方案,但多个模块合作的时候,就会显式出弊端,你必须了解对方模块中使用了哪些全局变量资源,从而避免冲突。如果 PHP 有包全局变量的话,就会安全的多。 3年前 回复
eechenPHP函数内可以通过global声明函数外部的全局变量,或者直接通过PHP内置的超全局变量$GLOBALS[]来访问,这样就不需要通过参数传递引用操作外部变量了.可以设计一个全局关联数组(哈希表)$app,需要的数据都压入$app,方便在函数内操作. 3年前 回复
eechenPHP函数内可以用static定义静态变量,比如保存数据库连接对象,可以避免一次请求中重复新建数据库连接对象. 3年前 回复
mark35也可以采用楼下回复的办法,采用Class类来组织函数为方法,共享数据保存到类的属性上去 3年前 回复
mark35可以自己选个全局变量,然后需要共享的数据都保存到那个全局变量中。比如采用$_G,然后在函数中 global $_G声明这个变量。我在js中也是采用相同的方式来解决变量共享问题 3年前 回复

引用来自“mark35”的评论

 

1. 变量不经声明直接使用,这会让我拼写错误的变量名称正常使用,如何避免这样的问题?
>>> 利用编辑器来帮助减少错误

2. 在函数内定义的函数是不是不支持?
>>> 不支持

3. PHP 能否支持闭包。
>>> (某个版本开始)支持。

4. PHP 是不是不支持块级作用域。
>>> 不支持

5. PHP 是不是不能分辨一个关联数组是列表还是哈希?
>>> 不能。PHP的数组是数组和hash表字典的合体

6. PHP 用关联数组模拟的哈希是不是会丢失数据插入的顺序?
>>> 应该是不会的。根据插入顺序决定
http://www.laruence.com/2009/08/23/1065.html

引用来自“Iolanguage”的评论

PHP 的变量要么是全局的,要么是函数内的局部变量,没有静态变量,也没有动态变量,看样如果多个函数共享一组数据,又不想污染全局变量命名空间的话,就只能把这组数据的引用当成参数传来传去。

PHP 的函数似乎不能动态的感知调用的 caller 环境。

请看PHP官网文档的OOP部分

另外静态变量动态变量PHP都有

如果非要知道caller环境,可以通过debug_backtrace函数获取,不过这样太蛋疼

顶部