PHP的基本常识.docx
《PHP的基本常识.docx》由会员分享,可在线阅读,更多相关《PHP的基本常识.docx(11页珍藏版)》请在冰豆网上搜索。
PHP的基本常识
PHP的基本常识
(1)
这些是写给初级PHP程序员或者入门不久的同学的,老鸟可以飘过,欢迎补充和评论;接受合理意见与批评。
这些PHP的概念,有些刚开始比较难懂,很难理解,我把他们都列出来,希望能帮助一些人,在前进的路上少点荆棘。
1.variablevariables(变量的变量)
variable_variables.php
ViewCode
php
$a='hello';
$hello='helloeveryone';
echo$$a.'
';
$b='John';
$c='Mary';
$e='Joe';
$students=array('b','c','e');
echo${$students[1]};
/*
foreach($studentsas$seat){
echo$$seat.'
';
}
$$var[1]
${$var[1]}for#1
*/
$a='hello';
将hello赋值给变量$a,于是$$a=${hello}=$hello='helloeveryone';
如果对于$$students[1], 这样会产生混乱,php的解释器可能无法理解,‘[’虽然有较高运算符,但结果可能无法输出。
好的写法是:
${$students[1]}=‘Mary’;
2.array'sfunction(数组函数)
array_functions.php
ViewCode
php
echo'
shift&unshift
';
$numbers=array(1,2,3,4,5,6);
print_r($numbers);
echo'
';
//shiftsfirstelemntoutofanarray
//theindexwillreset
$a=array_shift($numbers);
echo'a:
'.$a.'
';
print_r($numbers);
//pushelementtothefrontofarray
//returnsthecountofarrayandresetarrayindex
$b=array_unshift($numbers,'first');
echo'
b:
'.$b.'
';
print_r($numbers);
echo'
';
echo'
pop&push
';
//popthelastelementoutofarray
$c=array_pop($numbers);
print_r($numbers);
echo'
';
//pushtheelementtothelastofarray
$d=array_push($numbers,'last');
echo'd:
'.$d.'
';
print_r($numbers);
3.datesandtimes(时间和日期)
有3种方法可以创建一个unixtime(从1970/1/1到现在的秒数)
time(); 返回当前的时间戳
mktime($hr,$min,$sec,$month,$day,$year);mktime(6,30,0,5,22,2012)返回20125/226:
30:
00的时间戳
strtotime($string);strtotime("+1day")返回明天这个时候的时间戳更多'lastMonday''lasyYear'
----------------------------------------------------------
checkdate($month,$day,$year);验证一个日期是否为真checkdate(5,32,2012)?
'true':
'false';//returnfalse
得到了时间戳后,我们需要对它进行转化为可读的,如2012/5/22
我们有2种方法 date($format,$timestamp);strftime($format[,$timestamp])
推荐用第2种,strftime("%Y-%m-%d%H:
%M:
%S"); //return2012-05-2215:
46:
40
5.server variables(服务器和执行环境信息)
$_SERVER
server_variables.php
ViewCode
php
echo'SERVERdetails:
';
echo'SERVER_NAME:
'.$_SERVER['SERVER_NAME'].'
';
echo'SERVER_ADD:
'.$_SERVER['SERVER_ADDR'].'
';
echo'SERVER_PORT:
'.$_SERVER['SERVER_PORT'].'
';
echo'DOCUMENT_ROOT:
'.$_SERVER['DOCUMENT_ROOT'].'
';
echo'
';
echo'Pagedetails:
';
echo'REMOTE_ADDR:
'.$_SERVER['REMOTE_ADDR'].'
';
echo'REMORT_PORT:
'.$_SERVER['REMOTE_PORT'].'
';
echo'REQUEST_URI:
'.$_SERVER['REQUEST_URI'].'
';
echo'QUERY_STRING:
'.$_SERVER['QUERY_STRING'].'
';
echo'REQUEST_METHOD:
'.$_SERVER['REQUEST_METHOD'].'
';
echo'REQUEST_TIME:
'.$_SERVER['REQUEST_TIME'].'
';
echo'HTTP_USER_AGENT:
'.$_SERVER['HTTP_USER_AGENT'].'
';
echo'
';
6.variable_scope(变量的作用域globalstatic)
static_variables.php
ViewCode
php
functiontest()
{
$a=0;
echo$a;
$a++;
}
test();
echo'
';
test();
echo'
';
test();
echo'
';
echo'
';
functiontest1()
{
static$a=0;
echo$a;
$a++;
}
test1();
echo'
';
test1();
echo'
';
test1();
echo'
';
test()函数中的变量$a没有保存$a++的结果,重复调用test()并没有使$a的值增加
而test1()函数中变量$a申明了staic$a=0,为静态变量。
引用:
Astaticvariableexistsonlyinalocalfunctionscope,butitdoesnotloseitsvaluewhenprogramexecutionleavesthisscope.
一个静态变量只能存在于本地的函数作用域内也就是test1()函数体内,但是当程序离开这个test1()作用域时,静态变量不会失去它的值,也就是$a变量会增加1;当重新调用test1()时,$a=1;
global_variables.php
ViewCode
php
$a=1;
$b=2;
functionSum()
{
global$a,$b;
$b=$a+$b;
}
Sum();
echo$b;
echo'
';
$a=1;
$b=2;
functionSum1()
{
$GLOBALS['b']=$GLOBALS['a']+$GLOBALS['b'];
}
Sum1();
echo$b;
引用:
InPHPglobalvariablesmustbedeclaredglobalinsideafunctioniftheyaregoingtobeusedinthatfunction
如果这些变量将在函数中使用,全局变量必须在使用的那个函数中进行定义。
这样可以避免很多麻烦。
7.reference(引用)
variable_reference.php
ViewCode
php
$a='arist';
$b=$a;
$b='ming';
echo"Mynameis:
{$a}.Butmymothercallme{$b}.
";
echo'
';
$a='arist';
$b=&$a;
$b='ming';
echo"Mynameis:
{$a}.Andmymothercallme{$b}.
";
这个概念可以这样理解,我妈叫我明明,但是我的领导会叫我小言;不管是明明或者是小言,都是我。
'&'而这个就是不同的人叫我们的别名的方法即引用,相当于$a={我,或者内存中的值},$b={领导,妈妈,或者变量}
通过&,$b指向了$a在内存中唯一也是相同的值。
所以不管你领导叫你什么,或者你妈叫你什么,你都是你。
只是称呼不同。
所以通过引用后,我们改变$b的值,同时也改变了$a的值。
8.passreferencevariabletofunction(传递引用参数给函数)
php
functionref_test(&$var){
return$var*=2;
}
$a=10;
ref_test($a);
echo$a;
当我们按引用传递参数给函数时,我们传递地不是变量的副本(copy),而是真实的值,
所以当我们调用函数ref_test($a)的时候已经改变了$a的值,所以最后$a=20;
9.referencefunctionreturnvalue(引用函数的返回值)
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都指向同一个值,改变任何一个,都能改变同一个值。
PHP的基本常识
(2)
对象OOP
1.Fatalerror:
Using$thiswhennotinobjectcontext
这个错误刚学OOP肯定容易出现,因为有个概念你没有真正理解。
类的可访问性(accessible),也可以说是作用域,你还可以认为是1个中国人在国外,他不属于哪个文化,他不讲外语(可能他知道点);但是他无法通过自己跟老外沟通,因为他们不是在一个共同国度出生。
那么错误是如何发生的呢?
看下面的例子:
1
php
2classTrones{
3 staticpublic$fire="Iamfire.";
4 public$water="Iamwater";
5
6 staticfunctiongetFire(){
7 return$this->fire;//wrong
8 }
9 staticfunctiongetWater(){
10 return$self:
:
water; //wrong
11 }
12
13 staticfunctionFire(){
14 returnself:
:
$fire; //besureyouuseselftoaccessthestaticpropertybeforeyouinvokethefunction
15 }
16}
17
18/*
19Fatalerror:
Using$thiswhennotinobjectcontext
20*/
21//echoTrones:
:
getFire();
22//echoTrones:
:
getWater();
23
24//correct
25echoTrones:
:
Fire();
26echo"
";
27$trones=newTrones;
28$trones->fire;//Notice:
Undefinedproperty:
Trones:
:
$fire(baseondefferenterrorsetting)simpleiserror
29echoTrones:
:
$fire;
这个错误很经典,也很实用,先看static的定义:
Declaringclasspropertiesormethodsasstaticmakesthemaccessiblewithoutneedinganinstantiationoftheclass.Apropertydeclaredasstaticcannotbeaccessedwithaninstantiatedclassobject(thoughastaticmethodcan).
翻译:
定义一个类的属性或方法为静态时,可以使他们在不需要初始化一个类时就能直接访问。
一个被定义为了静态的属性不能被类的对象用对象操作符访问*->*,(可以通过静态的方法访问)。
例子说明:
7行10行犯了同一个错误,第一个是用对象操作符来访问静态变量。
你看看定义,$this是一个伪变量相当于object,一个实例。
你用对象操作符->访问就会报错。
同样你也不能用静态操作符:
:
来访问一个公共变量。
正确的访问应该是14行25行,一个是在类的定义里访问(self:
:
===Trones:
:
),一个是在类的外部访问。
对于继承类,以上的规则同样适合。
------------------------------------------------------分割线--------------------------------------------------------------------------------------
2.Fatalerror:
Calltoprivatemethod
最近有部连续剧很好看,叫权利的游戏,我们假设有3方人马,7个国王,平民,龙女。
他们三方人马在下面争夺最终的胜利,也就是王冠。
下面的故事还有一个标题:
类的可见性(visibility)你如果知道最终的答案,解释部分你可以略过了。
1
php
2
3classTrones{
4 protected$fire="fire";
5 public$water="water";
6 staticprivate$trones ="Trones";
7
8 protectedfunctiongetFire(){
9 $this->fire;
10 }
11
12 staticpublicfunctionTheDragenOfMather(){
13 return__METHOD__."use".$this->getFire()."getsthe".self:
:
getTrones();
14 }
15
16 staticpublicfunctiongetWater(){
17 return__METHOD__;
18 }
19
20 staticprivatefunctiongetTrones(){
21 return self:
:
$trones;
22 }
23
24}
25
26classKingsextendsTrones{
27 staticfunctionTheSevenKing(){
28 return__METHOD__."getsthe".self:
:
getTrones();
29 }
30}
31
32classPeopleextendsTrones{
33 staticfunctionThePeople(){
34 return__METHOD__."getsthe".self:
:
getTrones();
35 }
36}
37echoKings:
:
TheSevenKing();
38echoTrones:
:
TheDragenOfMather();
39echoPeople:
:
ThePeople();
正确答案是:
7国征战内斗,平民死伤无数,龙女想乘机渔翁得利;可惜最终谁也没有得到皇冠和胜利。
哈哈。
当static碰到private,结合产生复杂,也产生美;就像抽象的人,像我们大学老师讲的数学课;(不过网易的公开数学课很好)
如果想要龙女获得最后的胜利,你只要帮她一把将13行的$this->getFire()这部分去掉就可以了。
同样的道理你无法在一个静态函数里使用任何对象操作符。
怎么使人民获得王冠呢?
你去奋斗吧!
如果你不构建大型的框架和网站这些概念比如InterfaceImplementabstract。
。
。
你还是不知道的好。
PHP面向对象的进阶学习
学习内容:
抽像类、接口、final、类常量
一、抽像类(abstract)
在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性
语法结构:
abstractclass类名{
属性$name;
方法(){} //方法也可以为abstract修饰符function方法名(){}
}
例:
abstractclassanimal{
public$name;
public$age;
//抽象方法不能有方法体,主要是为了让子类去实现;
abstractpublicfunctioncry();
//抽象类中可以包含抽象方法,同时也可以包含实例类方法
publicfunctiongetname(){
echo$this->name;
}
}
classCat{
publicfunctioncry(){
echo'ok';
}
}
理解:
动物类,实际上是一个抽象的概念,它规定了一些动物有些哪共同的属性和行为,但实际上它自己并没收有那些属性和行为。
再比如:
交通工具类,植物类等等
注意:
1、如果一个类用了abstract来修饰,则该类就是一个抽象类,如果一个方法被abstract修饰,那么该方法就是一个抽象方法,抽象方法不能有方法体=>abstractfunctioncry(); 连{}也不可以有
2、抽象类一定不能被实例化,抽象类可以没有抽象方法,但是如果一个类包含了任意一个抽象方法,这个类一定要声明为abstract类;
3、如果一个类继承了另一个抽象类,则该子类必须实现抽象类中所有的抽象方法(除非它自己也声明为抽象类);
二、接口(interface)
接口就是将一些没有实现的方法,封装在一起,到某个类要用的时候,再根据具体情况把这些方法写出来;
语法结构
interface接口名{
//属性、方法
//接口中的方法都不能有方法体;
}
如何实现接口
class类名implements接口名{
}
理解:
接口就是更加抽象的抽象类,抽象类里的方法可以有方法体,但是接口中的方法必须没有方法体。
接口实现了程序设计的多态和高内聚、低偶合的设计思想;
例:
//接口是定义规范、属性的,一般以小写的i开头;
interfaceiUsb{
publicfunctionstart();
publicfunctionstop();
}
//编写相机类,让它去实现接口