PHP 基础(一)

目录

PHP安装

Mac:安装MAMP Windows:安装XAMPP Linux:独立安装各个组件

变量

我们来写一个基本的HTML

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Website</title>
</head>
<body>
    <h1>My Website</h1>
</body>
</html>

在HTML h1后面增加一个PHP的输出语句,

1
<?php echo 'Hello, World'; ?>

在浏览器中查看结果。对服务器来说,所有的HTML标记会原封不动的发送到客户端,但是一旦遇到了<?php的 开始标记,就会交给PHP处理程序进行处理,然后将结果发送回浏览器。在浏览器中查看源代码,我们只会看见 PHP的处理结果,而不会看见php的语句。

对php来说,我们也可以使用print来进行输出,不过使用echo在php的世界中更常用一些。字符串可以使用 单引号或者双引号。

1
2
3
4
<?php
    $name = 'Zhang Jinglin';
    echo $name;
?>

php中的变量使用$开始作为变量开始。 我们来看一下单引号和双引号之间的区别。

1
2
3
$name = 'zhangjinglin';
echo "Hello, $name"; //Hello, zhangjinglin
echo 'Hello, $name'; //Hello, $name

对php来说,双引号字符串中的变量是可以被解析的,单引号中的变量不被解析,直接原样输出。对于 不含变量的字符串来说,单双引号没有区别。

php使用.作为字符串连接符。

1
2
echo 'hello, ' . $name;
echo "hello, " . $name;

上面的语句结果相同。

php是和HTML结合在一起使用的。

1
2
3
4
<?php
    $name = 'zhangjinglin';
?>
<p>Hello, <? echo $name; ?></p>

一定要注意上面的<?php与?>的成对出现。

如果我们只是想输出一个变量,而不是执行一个语句,可以使用php的简洁写法。

1
<p>Hello, <?=$name?></p>

当然也可以直接使用php来输出与HTML的结合。

1
2
3
4
<?php
$name = 'zhangjinglin';
echo "<p>Hello, $name</p>";
?>

显示错误信息

下面的语句会出项错误,但是我们什么也看不到

1
2
3
<?
echo hello, world!;
?>

在php.ini的配置中,我们需要设定:

1
display_errors = On

当然,这个应该在开发环境中,在生产环境中需要设置为Off. 在XAMPP中,默认为On,但在其他环境中, 可能需要自行设定。

数组

比如我们想定义12个月的变量,当然可以使用$jan $feb ...去定义,不过最好的方式是使用数组。

1
2
$months = array('januara', 'february', 'march', 'april', 'may');
var_dump($months);

var_dump是用于输出数组的函数,不能使用echo输出数组。

1
2
echo $months[4]; //may
echo $months[0]; //januara

也可以使用php的数组简写定义方式(php 5.4 以上版本),和print_r来输出数组。

1
2
$months = ['januara', 'february', 'march', 'april', 'may'];
print_r($months);

在php中输出数组与html结合的方式。

1
2
3
4
5
6
7
8
<ul>
<?php
    $months = ['januara', 'february', 'march', 'april', 'may'];
    foreach ($months as $month) {
        echo "<li>$month</li>";
    }
?>
</ul>

php也可以定义在不同的位置上,我们在文件头部定义变量,这次定义一个关联数组。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
    $sites = array(
        'baidu' => 'www.baidu.com',
        'google' => 'www.google.com',
        'bing' => 'www.bing.com'
    );
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Website</title>
</head>
<body>
    <ul>
    <?php foreach($sites as $name => $url) {
        echo "<li>$name, $url</li>";
    } ?>
    </ul>
</body>
</html>

我们也可以更进一步,将输出改为:

1
echo "<li><a href='$url'>$name</a></li>";

php也提供了短写的写法,能够简化foreach if的语句复杂度,修改上面的语句为

1
2
3
4
5
6
7
<ul>
<?php foreach($sites as $name => $url): ?>
    <li>
    <a href="<?=$url?>"><?=$name?></a>
    </li>
<?php endforeach ?>
</ul>

这样,写起来会舒服一些。同样,if的写法:

1
2
3
4
5
<?php if (xxx): ?>
//html
<?php else: ?>
//html
<?php endif ?>

array_push($arr, $val) 向数组中添加数据,更简单的方法是$arr[] = $val。 对关联数组来说,使用$arr[$key] = $val。 array_pop($arr)删除最后一个数据,并返回删除数据。 array_shift($arr)删除开始的数据,并返回删除数据。 array_unshift($arr, $val) - 在数组开头插入一个或多个单元

在php.net中可以搜索所有的函数。

查看array_filter()函数,并掌握用法。

条件语句

if语句的格式

1
2
3
4
5
6
7
8
<?php
if() {
    //do something
} esleif() {
    //do other
} else {
    //do something else
}

一个简单的例子

1
2
3
4
5
6
7
8
<?php
$name = 'zjl';

if(strlen($name) == 3) {
    echo 'Your name length is 3';
} else {
    echo 'Your name length is not 3';
}

php中的判等有两种方式,注意类型

1
2
'3' == 3 // true
'3' === 3 // false

php中认为0, false都是假值,1, true, 已定义的变量都是真值。

1
2
3
4
5
<?php
$name = 'zjl';
$val = 0;
if ($name) echo 'true'; //true
if ($val) echo 'true'; //false

请自行了解switch。

可以使用isset来判断变量是否定义。

1
2
<?php
echo isset($name) ? "Hello, $name" : 'Noname';

循环

使用foreach来遍历数组。

1
2
3
4
5
6
7
foreach($arr as $item) {
...
}

foreach($arr as $key => $val) {
...
}

for语句也可以使用。

1
2
3
for ($i = 0; $i < count($arr); $i++) {
...
}

文件包含

在实际的工作中,我们可能有一些文件的很多内容是相同的,比如说多个页面都有相同的页面布局, 或者我们需要一些公共的函数库,这就可以使用PHP的文件包含功能。

比如我们创建一个文件,叫做header.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Include</title>
</head>
<body>
    <header>
        <h1>My Website</h1>
    </header>

这个文件包含了HTML模板头部,可以在多个文件中使用。

我们再创建一个footer.php文件,包含模板的尾部。

1
2
3
4
5
    <footer>
        <p>Copyright Infomation</p>
    </footer>
</body>
</html>

现在我们就可以定义多个文件来使用了。创建文件index.php。

1
2
3
4
5
<?php include 'header.php'; ?>
    <div class="container">
        <p>Main content.</p>
    </div>
<?php include 'footer.php'; ?>

再创建一个about.php文件,也使用包含文件

1
2
3
4
5
<?php include 'header.php'; ?>
    <div class="container">
        <p>About content.</p>
    </div>
<?php include 'footer.php'; ?>

可见,我们简化了很多的工作。

出了可以使用include也可以使用require来进行文件包含,两者的区别是,include如果没有找到文件 会发出警告并继续执行,而require会出现错误并停止执行。 还有一个require_once能够保证仅仅包含一次文件,即使你写了多个。比如你写了一个类B文件,依赖 另外一个类A,有可能其他的类C也依赖类A,当同时使用类B和类C就可能引入两次类A,所以使用require_once 就是一个好的选择。

函数和变量作用域

在php中使用function关键字来定义函数,函数可以包含参数和返回值。

1
2
3
4
5
6
7
<?php
function say_hello()
{
    return 'Hi, there';
}

echo say_hello();

当然我们也可以存储函数的返回值

1
2
$greeting = say_hello();
echo $greeting;

函数中添加参数

1
2
3
4
5
6
7
8
<?php
function say_hello($name)
{
    return "Hi, $name";
}

$greeting = say_hello('zhang jinglin');
echo $greeting;

如果函数有参数,但是调用的时候没有调用参数则会出错。我们也可以给函数参数一个默认值,这样, 调用的时候就不一定要赋值了。

1
2
3
4
function say_hello($name = 'nobody')
{
    return "Hi, $name";
}

我们可以使用print_r来输出数组信息,不过显示的结果并不是和直观,所以我们可以写一个工具 函数来输出数组或者变量的信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php

function pp($value)
{
    echo '<pre>';
    print_r($value);
    echo '</pre>';
}

$arr = ['name' => 'zjl', 'age' => 43, 'ocupation' => 'teacher'];
pp($arr);

假设我们有一个这样一个数组,数组的每个元素是一个包含个人信息的数组,也就是这样

1
2
3
4
5
$people = [
    ['name' => 'zjl', 'age' => 43, 'occupation' => 'Teacher'],
    ['name' => 'zhao si', 'age' => 50, 'occupation' => 'Actor'],
    ['name' => 'wang wu', 'age' => 21, 'occupation' => 'Student']
];

现在我们希望能有一个函数,能够根据我们提供的关键字来抽取出一个数组,比如抽取出所有的名字 组成的数组,也就是希望

1
array_pluck('name', $people); //['zjl', 'zhao si', 'wang wu']

我们来实现上面的函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function array_pluck($toPluck, $arr)
{
    $ret = [];
    foreach($arr as $item) {
        $ret[] = $item[$toPluck];
    }

    return $ret;

}

我们现在利用php提供的array_map来实现我们上面的函数。

1
2
3
4
5
6
function array_pluck($toPluck, $arr)
{
    return array_map(function($item) {
        return $item[$toPluck];
    }, $arr);
}

上面的函数将导致错误,说$toPluck是一个没有定义的变量。在php中,变量的作用域仅仅在函数中 ,这意味着我们的array_map的调用函数中是不存在$toPluck这个变量的。为了使用函数外部的变量, 我们需要修改代码

1
2
3
4
5
6
function array_pluck($toPluck, $arr)
{
    return array_map(function($item) use($toPluck) {
        return $item[$toPluck];
    }, $arr);
}

上面代码中的use($toPluck)将函数外部的变量带入到了函数中。

对象

我们来看一下php的对对象定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

class Person
{
    public $name;
    public $job;

    //构造函数
    public function __construct($name, $job)
    {
        $this->name = $name;
        $this->job = $job;
    }

    public function introduction()
    {
        return "I'm $this->name, a $this->job";
    }
}

$p = new Person('zjl', 'teacher');
echo $p->introduction();

php也提供了一个stdClass的类模板,我们可以直接使用。

1
2
3
4
5
6
7
8
<?php

$person = new stdClass;
$person->name = 'zjl';
$person->job = 'teacher';

var_dump($person);
echo $person->name;

在使用stdClass中要注意的问题是,不能使用方法,如果必须使用方法的话,就需要自定义类。

还可以使用强制类型转换来将数组转换为stdClass。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php

$person = [
    'name' => 'zjl',
    'job' => 'teacher'
];

var_dump($person);
var_dump((object)$person);

$o = (object)$person;
echo $person['name'];
echo $o->job;

heredocs

我们来看一下下面的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php

$post = [
    'author' => 'zjl',
    'title' => 'My Awesome Post',
    'body' => 'Here is the body',
    'publish-date' => '2016-3-15'
];

// 下面的语句会出错,对数组不能直接这样写
// $email = "<h1>$post['title']";
// 必须修改成带有{}的样式
$email = "<h1>{$post['title']}</h1><p>By: {$post['author']}</p><div>{$post['body']}</div>";

echo $email;

如果我们的内容更加复杂的话,$email的赋值语句会让我们崩溃的。我们可以稍微修改一下

1
2
3
$email = "<h1>{$post['title']}</h1>";
$email .= "<p>By: {$post['author']}</p>";
$email .= "<div>{$post['body']}</div>";

这样好一些,但仍然不会是一个好的解决方案。我们再进一步,使用php提供的sprintf()函数来格式化我们 要输出的信息。

1
$email = sprintf("<h1>%s</h1><p>By: %s</p><div>%s</div>", $post['title'], $post['author'], $post['body']);

有进步,但仍然不是很好。幸好,php提供了heredocs的功能。

1
2
3
4
5
$email = <<<EOT
<h1>{$post['title']}</h1>
<p>By: {$post['author']}</p>
<div>{$post['body']}</div>
EOT;

<<<EOT表示heredocs的开始,EOT可以用你自己定义的符号表示,比如<<<HAHA,但是结束标志要一致。

php提供了一个extract()的函数,它能够将一个关联数组中的数据编程一系列的变量,变量的名字就是key的 名字,值就是原先关联的值。

1
2
3
4
5
6
7
8
9
extract($post); //生成四个变量,$author,$title,$body,$publish-date

$email = <<<EOT
<h1>$title</h1>
<p>By: $author</p>
<div>$body</div>
EOT;

echo $email;