PHP学习笔记(一)

平时还是能时常看到PHP的代码的,然而每次都看不懂,抽几天了解下基本语法,但求看得懂就行….不做深入考虑
毕竟是世界上最好的语言,还是要了解一下的2333

看了这几门语言现在感觉有点乱了…..额….
也差不多全了,我想了解的,Google的Go语言…..再说

基础知识

打印是用echo和shell类似~~当然使用print_r也是可以的
在php中字符串连接符是用点.来表示的,这一点比较特殊,其它多数语言中是用加号+来表示的
php声明变量、调用都需要在前面加$
在PHP中,支持8种原始类型,其中包括四种标量类型、两种复合类型和两种特殊类型。
PHP会自动把变量转换为自动的数据类型
boolean类型不区分大小写,true输出为1,否则什么也没有
空为null,不区分大小写
逻辑运算有and、or、xor(逻辑异或;有且仅有一个为true的情况)、!、&&、||(and与||相同但是有优先级问题)


可以用 define() 函数来定义常量,在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。

常用系统常量:

(1)__FILE__ :php程序文件名。它可以帮助我们获取当前文件在服务器的物理位置。
(2)__LINE__ :PHP程序文件行数。它可以告诉我们,当前代码在第几行。
(3)PHP_VERSION:当前解析器的版本号。它可以告诉我们当前PHP解析器的版本号,我们可以提前知道我们的PHP代码是否可被该PHP解析器解析。
(4)PHP_OS:执行当前PHP版本的操作系统名称。它可以告诉我们服务器所用的操作系统名称,我们可以根据该操作系统优化我们的代码。

获取常量还可以使用constant()函数,接受一个str可以是常量名或者一个变量,返回这个常量的值;使用bool defined(string constants_name)判断是否存在常量


foreach特点,常用的两种形式:

  • 只取值,不要下标
    数组为例:foreach (数组 as 值){}
    汉字替换成变量即可
  • 取下标和值
    数组为例:foreach (数组 as 下标 => 值){}

可以将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉

数组

PHP有两种数组:索引数组、关联数组。
索引和关联两个词都是针对数组的键而言的。通俗将:索引数组就是一般的我们使用的用下标的方式,关联数组就是用key-value的形式,类似java的map

可以使用$arr = array();来创建一个空数组,也可用$fruit = array("苹果","香蕉","菠萝"); 的方式来创建索引数组。可以使用print_r($fruit);打印查看
对于数组的赋值,除了常规的方式,PHP还多了一种:用array()创建一个空数组,使用=>符号来分隔键和值,左侧表示键,右侧表示值。当然,索引数组中,键一定是整数。比如:array('0'=>'苹果');
循环取值除了常规的for循环也可以使用foreach,不过就是有点不习惯….两种数组都适用

1
2
3
4
5
<?php
$fruit=array('苹果','香蕉','菠萝');
foreach($fruit as $key=>$value){
echo '<br>第'.$key.'值是:'.$value;
}

函数

和js类似,使用关键字function来定义函数,PHP中也不允许函数返回多个值,只能是一个
这里有个在我看来很神奇的东西–可变函数

1
2
3
4
5
function name() {
echo 'jobs';
}
$func = 'name';
$func(); //调用可变函数

神奇就在于把一个变量赋予一个函数名的字串,竟然就可以通过这个变量调用函数了!至于到底是怎么回事我就不深究了,毕竟只是了解的心态,知道有这样的用法就行了,便于动态调用
我倒感觉这样写比较容易理解$func = name; 多好
个人认为最强大的还是内置函数,灰常多,灰常强大,常用的有
当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists('name')判断一下函数是否存在。同样的method_exists('name')可以用来检测类的方法是否存在。类是否定义可以使用class_exists;文件是否存在file_exists等

类和对象

和其他语言类似,也是有类与对象的定义,同样是用class作为关键字,举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
//定义一个类
class Car {
var $name = '汽车';
function getName() {
return $this->name;
}
}

//实例化一个car对象
$car = new Car();
$car->name = '奥迪A6'; //设置对象的属性值
echo $car->getName(); //调用对象的方法 输出对象的名字

比较让我在意的是:相对java来说,因为PHP中的.相当于java中的+;于是用->表示java中的.java:this.name在php写的话就是:$this->name;嗯我乱说的…..23333

在类的定义的时候,属性、方法是支持使用修饰符的,比如方法默认就是public啊,还有protected、private、static;对于静态属性则使用::双冒号进行访问不要用->;静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

类属性必须定义为公有、受保护、私有之一。为兼容PHP5以前的版本,如果采用 var 定义,则被视为公有。

方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。

构造函数与析构函数

PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。function __construct(){}
和java比的话这里有点区别,在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct() 显式的调用
PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。可以使用unset($className);回收对象进行测试,一般不需要手动调用

类似的,如果把构造函数私有化,那就不允许进行初始化了,比如单例模式

继承与重载

继承使用关键字extends,方法同可以进行覆盖
至于重载,就有些不同了

PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。
属性的重载通过__set__get__isset__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性
方法的重载通过__call来实现,当调用不存在的方法的时候,将会转为参数调用__call方法,当调用不存在的静态方法时会使用__callStatic重载。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class Car {
public $speed = 10;
//在这里使用重载实现speedDown方法,参数为方法名和调用时传入的参数
public function __call($name,$args){
if ($name == 'speedDown'){
$this->speed -= 10;
}
}
}
$car = new Car();
$car->speedDown(); //调用不存在的speedDown方法
echo $car->speed;

其他特性

对象复制,在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。

1
2
3
4
5
6
7
8
9
// 不需要返回值
public function __clone() {
$obj = new Car();
$obj->name = $this->name;
}
// -----f g x-------
$b = clone $a;
if ($a == $b) echo '=='; //true
if ($a === $b) echo '==='; //false

对象序列化,可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。

字符串

除了常规的定义方法,PHP中还可以这样定义:heredoc语法结构定义的字符串:

1
2
3
$hello = <<<TAG
hello world
TAG;

为什么感觉似曾相识,想不起是那种语言了,罢了
关于定义字符串单引号和双引号的区别:PHP允许我们在双引号串中直接包含字串变量。而单引号串中的内容总被认为是普通字符。

去除字符串的空格:

trim去除一个字符串两端空格。
rtrim是去除一个字符串右部空格,其中的r是right的缩写。
ltrim是去除一个字符串左部空格,其中的l是left的缩写。

计算长度与替换:

strlen() 最好用来计算英文字串的长度
mb_strlen() 可以用来计算中文,同时可以传入一个编码格式的参数
替换:str_replace(要查找的字符串, 要替换的字符串, 被搜索的字符串, 替换进行计数[可选])

字符串截取与查找:

英文:substr(字符串变量,开始截取的位置,截取个数)
中文:mb_substr(字符串变量,开始截取的位置,截取个数, 网页编码)
查找:strpos(要处理的字符串, 要定位的字符串, 定位的起始位置[可选])
返回的是索引,从0开始

格式化字串,没有数据类型就是好:

sprintf(格式, 要转化的字符串)
sprintf(‘%01.2f’,$str)
%06.2f—->整个字串至少需要6个字符占位,如果不足就用0填充,小数点后保留2位

合并与分割、转义:

合并:implode(分隔符[可选], 数组)
分割,返回数组:explode(分隔符[可选], 字符串)
转义:addslashes() 返回一个转义后的字符串,如’i’m’–>’i\’m’

正则

PHP中使用PCRE库函数进行正则匹配,preg_match(path,str)用于执行一个正则匹配,常用来判断一类字符模式是否存在。标识一个字串是正则可以用分隔符斜线:'/表达式/';分隔符可以是非数字、非反斜线、非空格的任意字符。经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)
分隔符后面可以使用模式修饰符,模式修饰符包括:i, m, s, x等,例如使用i修饰符可以忽略大小写匹配:'//i'
可以传入三个参数:preg_match($pattern, $subject, $matches);,匹配结果会写入到matches中,以数组的方式,第一个一般是完整的匹配,第二个就是第一个子组的所有匹配到的不确定字符 (: 大雾
\-==>_ 嗯…..
上面的方法只能匹配一次,想要匹配多次可以使用preg_match_all方法,用法一样

1
2
3
4
$string = 'April 15, 2014';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
echo preg_replace($pattern, $replacement, $string); //结果为:2014, April 15

其中${1}与$1的写法是等效的,表示第一个匹配的字串,$2代表第二个匹配的。分组技术~~~

喜欢就请我吃包辣条吧!

评论框加载失败,无法访问 Disqus

你可能需要魔法上网~~