PHP的基本常识小结


Posted in PHP onJuly 05, 2013

这些PHP的概念,有些刚开始比较难懂,很难理解,我把他们都列出来,希望能帮助一些人,在前进的路上少点荆棘。

1. variable variables(变量的变量)

variable_variables.php

<?php
$a = 'hello';
$hello = 'hello everyone';
echo $$a.'<br />';
$b = 'John';
$c = 'Mary';
$e = 'Joe';
$students = array('b','c','e');
echo ${$students[1]};
/*
foreach($students as $seat){
    echo $$seat.'<br />';
}
 $$var[1]
 ${$var[1]} for #1
*/

$a = 'hello';

将hello 赋值给 变量 $a, 于是 $$a = ${hello} = $hello = 'hello everyone';

如果对于 $$students[1],  这样会产生混乱,php的解释器可能无法理解,‘[' 虽然有较高运算符,但结果可能无法输出。

好的写法是:${$students[1]} = ‘Mary';

2. array's function(数组函数)

 array_functions.php

<?php
echo '<p>shift & unshift </p>';
$numbers = array(1,2,3,4,5,6);
print_r($numbers);
echo '<br />';
// shifts first elemnt out of an array
// the index will reset
$a = array_shift($numbers);
echo 'a: '.$a.'<br />';
print_r($numbers);
// push element to the front of array
// returns the count of array and reset array index
$b = array_unshift($numbers, 'first');
echo '<br />b: '.$b.'<br />';
print_r($numbers);
echo '<hr />';
echo '<p>pop & push </p>';
// pop the last element out of array
$c = array_pop($numbers);
print_r($numbers);
echo '<br />';
// push the element to the last of array
$d = array_push($numbers, 'last');
echo 'd: '.$d.'<br />';
print_r($numbers);

更多数组函数参考

3. dates and times (时间和日期)

有3种方法可以创建一个unix time(从1970/1/1 到现在的秒数)

time(); 返回当前的时间戳

mktime($hr, $min, $sec, $month, $day, $year); mktime(6,30,0,5,22,2012) 返回2012 5/22 6:30:00 的时间戳

strtotime($string); strtotime("+1 day") 返回明天这个时候的时间戳 更多 'last Monday' 'lasy Year'

checkdate($month, $day, $year); 验证一个日期是否为真 checkdate(5,32,2012) ? 'true' : 'false'; // return false

得到了时间戳后,我们需要对它进行转化为可读的,如2012/5/22

我们有2种方法 date($format, $timestamp) ; strftime($format [,$timestamp])

推荐用第2种,strftime("%Y-%m-%d %H:%M:%S"); // return 2012-05-22 15:46:40

更多时间日期参考

5. server variables (服务器和执行环境信息)

$_SERVER

server_variables.php

<?php echo 'SERVER details:<br />'; 
echo 'SERVER_NAME: '.$_SERVER['SERVER_NAME'].'<br />'; 
echo 'SERVER_ADD: '.$_SERVER['SERVER_ADDR'].'<br />'; 
echo 'SERVER_PORT: '.$_SERVER['SERVER_PORT'].'<br />'; 
echo 'DOCUMENT_ROOT: '.$_SERVER['DOCUMENT_ROOT'].'<br />'; 
echo '<br />'; 
echo 'Page details:<br />'; 
echo 'REMOTE_ADDR: '.$_SERVER['REMOTE_ADDR'].'<br />'; 
echo 'REMORT_PORT: '.$_SERVER['REMOTE_PORT'].'<br />'; 
echo 'REQUEST_URI: '.$_SERVER['REQUEST_URI'].'<br />'; 
echo 'QUERY_STRING: '.$_SERVER['QUERY_STRING'].'<br />'; 
echo 'REQUEST_METHOD: '.$_SERVER['REQUEST_METHOD'].'<br />'; 
echo 'REQUEST_TIME: '.$_SERVER['REQUEST_TIME'].'<br />'; 
echo 'HTTP_USER_AGENT: '.$_SERVER['HTTP_USER_AGENT'].'<br />'; 
echo '<br />';

更多详细信息

6.variable_scope(变量的作用域 global static)

static_variables.php

<?php
function test()
{
    $a = 0;
    echo $a;
    $a++;
}
test();
echo '<br />';
test();
echo '<br />';
test();
echo '<br />';
echo '<hr />';
function test1()
{
    static $a = 0;
    echo $a;
    $a++;
}
test1();
echo '<br />';
test1();
echo '<br />';
test1();
echo '<br />';

test() 函数中的变量 $a 没有保存 $a++ 的结果 , 重复调用test() 并没有使 $a 的值增加

而test1() 函数中 变量 $a 申明了 staic $a = 0, 为静态变量。

引用:A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.

一个静态变量 只能存在于本地的函数作用域内 也就是test1() 函数体内, 但是当程序离开这个test1() 作用域时,静态变量不会失去它的值,也就是 $a 变量会增加 1; 当重新调用 test1() 时,$a = 1;

global_variables.php

<?php
$a = 1;
$b = 2;
function Sum()
{
    global $a, $b;
    $b = $a + $b;
} 
Sum();
echo $b;
echo '<hr />';
$a = 1;
$b = 2;
function Sum1()
{
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
} 
Sum1();
echo $b;

引用:In PHP global variables must be declared global inside a function if they are going to be used in that function

如果这些变量将在函数中使用,全局变量必须在使用的那个函数中进行定义。 这样可以避免很多麻烦。

更多详细信息

7.reference(引用)

variable_reference.php

<?php 
$a = 'arist'; 
$b = $a; 
$b = 'ming'; 
echo "My name is:{$a}. But my mother call me {$b}.<br />"; echo '<hr />'; 
$a = 'arist'; 
$b = &$a; 
$b = 'ming'; 
echo "My name is:{$a}. And my mother call me {$b}.<br />";

这个概念可以这样理解,我妈叫我明明,但是我的领导会叫我小言;不管是明明或者是小言,都是我。
'&' 而这个就是不同的人叫我们的别名的方法 即引用,相当于 $a = {我,或者内存中的值} , $b = {领导,妈妈,或者变量}
通过 & , $b指向了$a 在内存中唯一也是相同的值。 所以不管你领导叫你什么,或者你妈叫你什么,你都是你。只是称呼不同。

所以通过引用后, 我们改变$b的值,同时也改变了$a的值。

8. pass reference variable to function(传递引用参数给函数)

<?php 
function ref_test(&$var){ 
return $var *= 2; 
} $a = 10; 
ref_test($a); 
echo $a;

当我们按引用传递参数给函数时,我们传递地不是变量的副本(copy) ,而是真实的值,

所以当我们调用函数ref_test($a)的时候已经改变了 $a 的值, 所以最后 $a = 20;

9. reference function return value(引用函数的返回值)

reference_function_return_value.php

<?php 
function &increment(){ 
static $var = 0; 
$var++; 
return $var; 
} $a =& increment(); // 1 
increment(); // 2 
$a++; //3 
increment(); // 4 
echo "a: {$a}";

首先申明一个引用函数,在函数体内,申明一个静态变量 $var, 可以保存增加的值;

$a =& increment(); 这条语句是 变量$a 引用 函数increment() 的返回值,

和前面的引用变量一样, 你可以把increment()函数, 看作是一个变量; 这样就变为 $a = & $b;

所以increment() 和 $a 都指向同一个值,改变任何一个,都能改变同一个值。

更多详细信息

对象 OOP

1.Fatal error: Using $this when not in object context

这个错误刚学 OOP 肯定容易出现,因为有个概念你没有真正理解。 类的可访问性(accessible),也可以说是作用域, 你还可以认为是 1个 中国人 在国外,他不属于哪个文化,他不讲外语(可能他知道点);但是他无法通过自己跟老外沟通,因为他们不是在一个共同国度出生。
那么错误是如何发生的呢?看下面的例子:

<?php
 class Trones{
     static public $fire = "I am fire.";
      public $water = "I am water";     static function getFire( ) {
         return $this->fire ; // wrong
     }
     static function getWater( ) {
         return $self::water ;  // wrong 
     }
     static function Fire( ) {
         return self::$fire ;  // be sure you use self to access the static property before you invoke the function
     }
 }
 /*
 Fatal error: Using $this when not in object context
 */
 //echo Trones::getFire( ) ;
 //echo Trones::getWater( ) ;
 // correct
 echo Trones::Fire( );
 echo "<br />" ;
 $trones = new Trones ;
 $trones->fire ; // Notice: Undefined property: Trones::$fire (base on defferent error setting) simple is error
 echo Trones::$fire ;

这个错误很经典, 也很实用,先看 static 的定义:

Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static can not be accessed with an instantiated class object (though a static method can).

翻译:定义一个类的属性或方法为静态时,可以使他们在不需要初始化一个类时就能直接访问 。一个被定义为了静态的属性不能被类的对象用对象操作符访问* -> *,(可以通过静态的方法访问)。

例子说明:
7行 10行 犯了同一个错误,第一个是用对象操作符来访问静态变量。你看看定义,$this 是一个伪变量 相当于 object,一个实例。你用对象操作符 -> 访问就会报错。

同样你也不能用 静态操作符 :: 来访问一个公共变量 。 正确的访问应该是 14行 25行,一个是在类的定义里访问(self:: === Trones::),一个是在类的外部访问。

对于继承类,以上的规则同样适合。

2.Fatal error: Call to private method

最近有部连续剧很好看,叫权利的游戏,我们假设有 3方人马, 7个国王, 平民, 龙女。 他们三方人马在下面争夺最终的胜利, 也就是王冠。

下面的故事还有一个标题:类的可见性(visibility) 你如果知道最终的答案,解释部分你可以略过了。

<?php 
 class Trones {
     protected $fire = " fire ";
     public $water = " water " ;
     static private $trones  = "Trones";     protected function getFire( ) {
         $this->fire ;
     }
     static public function TheDragenOfMather( ) {
         return __METHOD__." use ".$this->getFire()." gets the ".self::getTrones( ) ;
     }
     static public function getWater( ) {
         return __METHOD__ ;
     }
     static private function getTrones( ) {
         return  self::$trones ;
     }
 }
 class Kings extends Trones {
     static function TheSevenKing( ) {
         return __METHOD__."gets the ".self::getTrones( );
     }
 }
 class People extends Trones{
     static function ThePeople( ) {
         return __METHOD__."gets the ".self::getTrones( );
     }
 }
 echo Kings::TheSevenKing( ) ;
 echo Trones::TheDragenOfMather( ) ;
 echo People::ThePeople( ) ;

正确答案是:7国征战 内斗,平民死伤无数,龙女想乘机渔翁得利;可惜 最终谁也没有得到皇冠和胜利。哈哈。

当static 碰到 private ,结合产生复杂,也产生美;就像抽象的人,像我们大学老师讲的数学课;(不过网易的公开数学课很好)

如果想要龙女 获得最后的胜利, 你只要帮她一把 将13行的 $this->getFire() 这部分去掉就可以了。同样的道理 你无法在一个静态函数里 使用任何对象操作符。

怎么使人民获得王冠呢? 你去奋斗吧!

如果你不构建大型的框架和网站 这些概念比如 Interface Implement abstract 。。。 你还是不知道的好。

PHP 相关文章推荐
用PHP制作静态网站的模板框架(一)
Oct 09 PHP
用PHP来写记数器(详细介绍)
Oct 09 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
php压缩多个CSS为一个css的代码并缓存
Apr 21 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
PHP、Java des加密解密实例
Apr 27 PHP
php需登录的文件上传管理系统
Mar 21 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
Apr 18 PHP
PHP7 echo和print语句实例用法
Feb 15 PHP
php集成开发环境详解
Sep 24 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 #PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 #PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 #PHP
php记录代码执行时间(实现代码)
Jul 05 #PHP
如何修改和添加Apache的默认站点目录
Jul 05 #PHP
解析php类的注册与自动加载
Jul 05 #PHP
php 注册时输入信息验证器的实现详解
Jul 05 #PHP
You might like
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
PHP读取xml方法介绍
2013/01/12 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
jquery实现手风琴效果实例代码
2013/11/15 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
python中split方法用法分析
2015/04/17 Python
Python读取键盘输入的2种方法
2015/06/16 Python
Python调用C++程序的方法详解
2017/01/24 Python
python文本数据相似度的度量
2018/03/12 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
python实现二维数组的对角线遍历
2019/03/02 Python
python将时分秒转换成秒的实例
2019/12/07 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
python从PDF中提取数据的示例
2020/10/30 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
工业学校毕业生自荐信范文
2014/01/03 职场文书
道路交通安全实施方案
2014/03/12 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
党的作风建设心得体会
2014/10/22 职场文书