php编程疑难解决-1
全局变量和超全局变量
- 如果是php脚本script 或php代码, 一定要放在 php标签内
<?php ?>
内。 这样apache才会把他当做php脚本内容来解析, 才会去调用php模块解析,然后返回解析后的内容,因为无论是php还是html文件扩展名,都是由apache来接受请求并解析的,都是按html代码来处理的,只是在遇到php标签的时候,才认为是php脚本代码。
也就说,在写web的时候, 总是先有 标签, 后有 内容! 应该将内容都放在标签中,而不是直接将 内容放在文件中。
1.php的全局变量是 针对一个文件内部, 一个文件域而言的。
凡是在函数外部的变量都叫做 全局变量
跟c/c++的全局变量思维不一样,php认为函数内外的变量是 两个互不想通, 互不可见的(函数内的变量是局部变量)。即全局变量不能在 函数内使用。 确实要在函数内部使用全局变量,就要使用 global语句,或者叫global 关键字声明。
<?php
$name = 'jack';
function getName(){
global $name;
echo $name;
}
getName();
?>
-
php的变量声明?
可以不用声明变量,直接使用;
但跟其他编程语言的思想相类似, 变量应该、最好是先声明再使用;
但是要注意的是, 全局变量的声明不能使用var, 而类定义中的 成员变量声明时应该使用 var关键字!
声明的时候, 你可以只写这个变量,但这样在形式上,和实际作用上意义都不大, 所以, 应该将变量的声明和初始化相结合,这样既声明了变量,同时又给变量初始化,赋了初值。 -
unexpected T_VAR in c:\foo.php on lin2, 其中T_VAR表示 terminate variable, 表示意外的 变量结尾,实际上就是变量的声明错误
-
变量声明错误是parse ERROR, 而变量undefined variable未声明是notice! 警告
-
php的超全局变量?
所谓super global variables, 就是函数外的变量,可以直接在函数内使用,而且不需要用global语句声明的变量
超全局变量都要大写!
超全局变量有两种,一种是系统预定义的,另一种是用户自定义的;
- (php)系统预定义的超全局变量,是用下划线打头,并且全部大写,如$_GET, $_POST, $_SERVER , $_FILES, $_COOKIES...等
- 用户自定义的超全局变量只有一个,就是 $GLOBALS, 注意没有下划线,而且是全部大写,GLBOALS, 有s复数
<?php
$GLOBALS['name'] = 'JACK';
function getName(){
echo $GLOBALS['name'];
}
getName();
?>
- html扩展名中,不能包含php标签及其内容, 因为会自动过滤和忽略! 而php扩展名文件中,则可以自动识别html标签。
-
所谓的全局变量,实际上也只是 “文件域”的,只是在当前文件范围内有效。
一个文件要使用另一个文件中的 所谓的 “全局变量”,要使用 include... -
在php标签中,可以包含其他php文件, 在使用包含include/require/_once 的时候,其实是做了一些处理、工作的: 先将被包含文件的php标签先去掉/剥离,
然后只是将其中的php标签中的内容包含、复制过来。
所以, 如果在php标签中, 你就不能直接地再次使用,php的标签了,也就是说, php标签是不能嵌套的. 否则就会出错,如:<?php <?php ....?> .... ?>
-
但是php的包含include语句,跟c/c++的又有所区别: 被包含的php文件,一定要写 php标签, 否则你以为像c语言一样,直接复制过来的.但是在php中, 如果被包含文件没有php标签的时候, 只是把其中的内容当做"纯粹的/原生的html内容来输出,比如:
$foo=10;
只会直接在浏览器中 输出$foo=10;
而并不会认为是一个php变量$foo
, 所以后面使用echo $foo;
的时候, 就会报错:Notice: Undefined variable: foo
echo $GLOBALS; 的输出结果:
Array(
....
[SCRIPT_FILENAME] => C:/wamp/www/foo.php
[REMOTE_PORT] => 49275 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] =>
[REQUEST_URI] => /foo.php
[SCRIPT_NAME] => /foo.php
[PHP_SELF] => /foo.php
[REQUEST_TIME] => 1507607647 )
**[name] => JACK**
)
foo.php文件内容:
<?php
$GLOBALS['age'] = 10;
print_r($GLOBALS); // 只是包含 系统超全局变量 和一个 age index变量
?>
bar.php文件内容
<?php
$GLOBALS['name'] = 'JACK';
function getName(){
echo $GLOBALS['name'];
}
getName();
echo "<br>";
print_r($GLOBALS); // 执行完foo.php后, 再执行bar.php, 这时显示的仍然只有系统超全局变量 和 name 索引变量, 并没有 age索引...
?>
先后执行foo.php, 和 bar.php, 看到 $GLOBALS的内容中并不同时包含 ['name'] 和 ['age']. 只是包含其中之一!
结论:
-
$GLOBALS 包含所有的 "超全局变量" , 甚至包括: _GET,_POST, _ENV, _FILES, _COOKIES, _SERVER等系统于定义的超全局变量 + 自定义super globals
-
php脚本是解释型,不是编译型, 并不能像c语言那样, 一个全局变量执行完后, 仍存在于内存中, 确实是所有文件都可以共用的全局变量 , 但是在php中, 脚本是"无状态的"! 即: 一个脚本文件执行完毕后 , 关于这个脚本的 所有的内存变量都要被清除, 抹掉, 服务器端(php语言)不会保持 这个被请求的php脚本的执行后的任何内容. 当下一次请求其他php脚本的时候, 所有的一切 内存变量都要 重新开始, "一切又要从头开始" 好像以前的任何脚本都没有执行过.
-
因此, 虽然\(GLBOALS是超全局变量, 但是你并不能将一个 脚本文件foo.php中的\)GLBOALS 索引变量,带到 另一个 脚本文件bar.php中来, 因为foo.php执行完毕后, 内存中的$GLBOALS就已经被 销毁了, 根本就不存在了. 而执行 bar.php的时候, 这个 $GLBOALS 又是 重新 建立的.
-
因此 不同脚本文件中的 $GLBOALS是变化的, 执行每个不同的脚本,其值可能是不同的! 文件与文件之间的 $GLBOALS 不是互相传递的.
-
或者说: php是不保存状态的, 一个php脚本中的变量 跟另一个 脚本中的 同名 变量是 没有毛关系的. 彼此老死不相往来,除非 include...
关于三个函数的区别: is_null, isset, empty?
-
在php中,单是一个$foo;是没有任何意义的, 并没有定义、声明这个变量: 这个foo变量会被认为是 null, 会被认为是not set,同时会被
认为是undefined. 是没有被定义的. -
变量为null 只有两种情况: 一是
$foo;
二是$foo = null;
即没有任何定义,或直接明确赋值为null -
对于defined和undefined判断,凡是null,都是认为 没有定义的.
总之, 只有两种情况下是null
- isset判断,也很简单, 只要是 一个变量为 非null的,就是 is already set的.
- empty, 任何一种数据类型都可以/可能是empty的,包括:
数字: 0,
boolean: false;
字符串型: '', '0', 单是空格字符串' '不是empty的
null型的: 都是empty.
复杂类型的 array() 空数组
只要给变量赋值, 哪怕是空字符串'', 这时变量就不再为null了,虽然他还是为empty.
<?php
$name; // 像这样的语句其实是没有任何意义的,当然也不会认为是错误的
if(defined($name)){echo '$name is defined';}else{ echo '$name is undefined';}
if(is_null($name)){
echo "name is null";
}else{
echo "name is not null";
}
echo "<br>---------------------------------<br>";
$name = null;
if(defined($name)){echo '$name is defined';}else{ echo '$name is undefined';}
echo "<br>";
if(is_null($name)){
echo "name is null";
}else{
echo "name is not null";
}
echo "<br>---------------------------------<br>";
if(isset($age)){
echo "age is set";
}else{
echo "age is not set";
}
echo "<br>---------------------------------<br>";
if(empty($name)){ echo 'name is empty';}else{echo 'name is not empty';}
echo "<br>---------------------------------<br>";
$name=''; // 这里name被赋予空字符,但已经不是null了, 也就是说,只有给变量赋值, 变量就不为null
if(is_null($name)){
echo "name is null";
}else{
echo "name is not null";
}
?>
-
超全局变量$_GLOBLAS也是文件域的
当一个文件结束时, 所有有关这个文件的东西都将在内存中消失.
get/post的内容是如何传递到 "跳转"文档中的?
可能有两种可能:
一种是: 跳转时, 原文档本身并是马上关闭, 要将传递的内容传递 到 目标页面后(即在交际的时间点, 是有两个文档 在内存中同时并存被打开的, 即A -> B , 那么A和B 都打开并同时生存), 原文档才关闭.
另一种可能是: 源文档中的传递变量/参数, 由apache来管理, 将它发到一个临时内存变量区中, 随即关闭原文档, 然后再打开 跳转的目标文档, 然后把保存的 变量合并到目标文档中.
两种方式, 都可实现, 但是反正都是单文件作用域的 -
php和html: 一切都是标签 的 标签文档
由于php和html都是在服务器端执行的“脚本”不是在os下执行的C/c++程序,所以它是面向的apache,所以是标签文档,“一切都是标签”:严格来说,文档中只有标签. 所有的内容都要用标签来进行"语义化"说明. 那种随便"甩东西在文档中"的写法其实是没有理解标签文档的含义的 -
在php中, 要计算"数字字符串"的数值时, 不要使用toint()函数 ,应该使用intval()函数.因为这个函数会做一些安全性处理.
当判断一个变量是否为数字,否则进行赋值时的 "通用写法"是:
if( isset($_GET['id']) && !empty($_GET['id']) )
- 在php中,变量的名称是不包括前面的\(符号的,\)只是一种前导符一种格式.比如出错信息是: " undefined varible nChar in ... on line x" 其中的变量是 $nChar.
php代码 双引号字符串中的空格、表示空格的字符表示符号在html浏览器中的显示效果:
因为浏览器会把多个空格(包括制表符)当做一个 空格来显示,所以:
-
凡是: 字符串中 的一个space, 多个space, \n, \t 都将只显示为一个空格的效果;
-
在代码中 不一定总是用 回车、换行来分割显示, 使用空格也可以的。
-
APR是什么?
APR是apache portalbe runtime (library) 可移植运行库, 是从apache项目中分离出来的,(以前的apache是自己在内部, 来实现对操作系统调用的实现, 现在就不是自己直接实现了, 而是apache内部组件 通过 APR (相当于中间件) 来对操作系统资源的调用了 )将不同操作系统平台如win, unix, linux等平台下的系统调用进行封装.便于移植, 同时也减轻了apache的重量.
pcre: perl compatible regular expression: perl 兼容正则表达式. 因为apache在处理一些应用/模块如 rewrite.so重写模块的时候,可能就要用到这个pcre.所以手动安装时可能也要求安装pcre.
关于php的数据类型?
<?php
$a=10; // 整数, 包括十进制/ 十六进制的0x表示的, 八进制的 0123 表示的. 都算.
$b=10.2e3; // 只要是用 指数形式或科学计数法表示的都是 浮点数: float/double/real
$c=11.0;
$d='123';
$e=11.2;
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($e);
echo gettype($a)."<br>";
echo gettype($b)."<br>";
echo gettype($c)."<br>";
echo gettype($d)."<br>";
echo is_numeric($a)?"\t数字":"非数字\t";
echo is_numeric($b)?"\t数字":"非数字";
echo is_numeric($c)?"\t数字":"非数字\t";
echo is_numeric($d)?"\t数字":"非数字\t";
settype($a,"double");
echo "<br>".$a;
echo "<br>".gettype($a)."<br>";
?>
上述代码显示的结果:
int 10
float 10200
float 11
string '123' (length=3)
float 11.2
integer
double
double
string
数字 数字 数字 数字
10
double
结论:
-
php中的数据类型, 包括8种“正式”的, 3种“伪类”的
4种基本、标量类型: 整数,浮点数,布尔值,字符串
2种复合类型: 数组, 对象
2种特殊类型: 资源resource, NULL空
为了便于理解函数 的参数类型, 规定了3种伪类: mixed,numeric, call_user_function -
关于php中的数字?
因此,数字其实是一种 "伪类",叫number, 包括: int, float, 数字字符串"123"等.即上面的$a/b/c/d判断是否为数字时,都显示为true! -
判断变量类型的函数有: is_numeric, is_string, is_bool, is_array, is_object, is_resource.注意的是, "123"这样的数字字符串, 即是数字, 又是字符串的类型...
-
在显示echo, 或var_dump的时候,即使是浮点数(有小数点)的,只要小数点后面是0,仍然会将小数点后面的部分去掉只显示前面的整数部分, 比如: 10.0,12.00都只显示为10, 12
1.(print 和 print_r可以显示简单变量,但是只是显示值, 不会显示显示 “数据类型”!) var_dump和gettype显示的类型略有区别, 前者可以认为是“简单”显示, 后者是“完整”显示,比如: 整数,前者显示为int, 后者显示为interger; 浮点数前者显示为 :float,后者显示为double. 字符串都显示为string.
-
而且字符串 var_dump还会显示长度(length=x)
-
所以, 对于php来说, 因为是弱类型语言,所以在定义变量时, 并不需要声明变量类型, 甚至, 同一个变量\(a, 还可以赋予不同类型的值, 如\)a=10, 后面还可以$a="abc". 都是可以的! 因此,不需要用int/integer之类的关键字来说明。所以 对于php变量的类型“名称、字符串”,只是我们使用的“人”的一种称呼, php代码本身其实并不关心“什么称呼”的! 或者说 根本就没有这种说法或问题存在。
甚至说, 某个变量是整数, 可以说是: int, integer, 你如果高兴,也可以说他是: inti, inte, integ, integering都可以???只要你的代码中的数据类型在运算时是正确合适的就行。
所以, 可以说: php中的int 跟 integer没有区别,相等的; 同样的float,double, real都认为是相等的,一回事!
php是解释型还是编译型?
是否做类型检查?
php代码尧转换为c代码吗? 为什么有 function {main}()?
关于html代码的写法?
10<pre class='xdebug-var-dump' dir='ltr'><small>int</small> <font color='#4e9a06'>10</font>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>float</small> <font color='#f57900'>10200</font>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>float</small> <font color='#f57900'>11</font>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>string</small> <font color='#cc0000'>'123'</font> <i>(length=3)</i>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>float</small> <font color='#f57900'>11.2</font>
</pre>integer<br>double<br>double<br>string<br> 数字 数字 数字 数字<br>10<br>double<br><br />
<font size='1'>
<table class='xdebug-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Fatal error: Unsupported operand types in C:\wamp\www\index.php on line <i>30</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0004</td><td bgcolor='#eeeeec' align='right'>375752</td><td bgcolor='#eeeeec'>{main}( )</td><td title='C:\wamp\www\index.php' bgcolor='#eeeeec'>..\index.php<b>:</b>0</td></tr>
</table>
</font>
-
echo可以输出任意内容:除了html代码外,还可以输出 对浏览器端 的 script的js脚本内容:
比如:echo "<script>alert(\"请先登录再进行操作\"); window.open('/', '_top'); </script>";
在双引号中, 可以嵌套单引号,如果确实要嵌套双引号, 可以使用 \进行转义。 -
isset可以带多个参数:
if(!isset($_SESSION["uid"],$_SESSION["username"]))
?
isset: 其中的set表示设置的意思,就是判断一个变量是否已经设置,而且是否为null
如果一个变量被unset,肯定就是isset为false了。
注意变量被设置为"",其实是被设置为 \0,但是他就不是null了.
isset可以带多个 参数, 此时,只有 这些所有的参数 都被设置且不为null, 才返回true. 否则返回false. 参数是从左到右进行检查,遇到错误false马上停止检查 -
平时 多读 多记 别人的代码, 框架代码, 就是增长自己的内功的过程。 要把整个代码做到“炉火纯青”的地步,直到所有的代码都 “烂熟于心”的地步。
-
switch语句的case中,如果比较少, 比较简单的话, 就只用一行来表示就可以了.
switch($column){
case 'match_bd31':
if(($mb_inball==3) && ($tg_inball==1)) $status=1;break;
}
- html代码和php代码的更紧密的融合:以前没有记住的就是在 "同一个语句中,讲html代码和php代码变量的混合书写", 多用在php文件中的 a 标签的写法:
1. 简单的写法 echo '<span>hello</span>';
2. 算是比较融合的写法 <?php for($i=1; $i<3;$i++){ ?>
<tr><th>some text</th></tr>
<?php } ?>
3. 更完全的更紧密的写法
for($i=1;$i<=3;$i++)
{
$str .="<a href='{$this->pageUrl}={$i}' >$i</a>"."\n" ;
$str .= "<a href='{$this->pageUrl}={$i}'>$i</a>"."\n";
}
- var关键字是js中定义变量的, 在php中都不使用的。不管是全局、局部变量还是类的成员变量都不用的
php更多的是接近 java的语言。
在定义php的类的时候, 所有的成员变量 和成员函数 都 要用 private/protected/public 来定义, 不需要用
var来定义。
至于static和public之间的位置先后关系, 没有固定的规定, 前后都可以的: public static function getInstance; static private $_instance等等都是可以的。 私有的成员变量和成员函数推荐用下划线开头。
-
修改apache httpd的监视端口/服务器端口,非常简单,就只是改变一下 listen 80的值,比如8080,然后重启httpd服务即可.
-
在windows下,主配置是在conf/下的httpd.conf, 还可以包含一些附加配置去增加apache的一些附加features, 附加配置是放在conf/extra目录中,然后只需要在httpd.conf主配置中包含这些附加配置即可.或直接将附加配置文件
也是conf结尾的 **.conf
的 内容拷贝到主配置文件中.
添加附加配置文件, 确实是添加要去掉#号, 如果加上#, 就被屏蔽了,也就是,不包含这个附加配置
当附加配置的内容有错误的时候,有可能导致 主配置文件出错->导致apache服务启动不起来.
mysqli和mysql 的区别? 主要参考: http://www.jb51.net/article/28103.htm
- apache和php都只有 核心 模块, 因为不可能把所有的 插件/模块/扩展 在一开始就写好/写完, 所以采用了 可扩展的插件/模块的方式.
这中方式 , 主要是在他的 配置文件中进行配置(当然实体文件 要放在对应的 extra/modules/extensions), 如httpd.conf中配置模块LoadModule... 而php是在
php.ini中进行设置 - mysqli其实并不是什么新的数据库, 他只是php的一个扩展, 用来 操作mysql数据库的一个扩展. 是和 php-mysql 扩展- php-mysqli的扩展 相对比的
- 在写mysql的查询语句的时候, 一种固定的写法是 : 使用双引号来表示查询字符串, 然后里面的 表示字符串类型的字段一定要用 单引号阔起来, 这样即使里面包含变量的话, 也是在双引号中, 也是有效的 :
$sql="select name from users which location='$location'";
- mysqli是php-mysql 的improvement增强版, 一是提供的功能更多, 而是安全性有所增强, 同时支持 oop/oos的写法.如:
$conn = new mysqli($db_host, $db_user, $db_passwd, $db); ...
- 同时php-mysqli 采用的 永久/持久性连接... 而php-mysql采用的是 非持久连接..