准备工作

  1. 在XAMPP安装目录下,检查xampp\php\ext\php_mysql.dll文件是否存在,php_mysql.dll文件和php_mysqli.dll文件是PHP连接MySQL数据库的基础。

  2. 打开XAMPP软件的安装目录xampp\php\php.ini文件,检查以下语句是否存在,若不存在需添加:

    extension=php_mysql.dll
    extension=php_mysqli.dll

  3. 启动XAMPP的apache和mysql。

  4. 附1:若没有建立数据库,使用以下语句:

    CREATE DATABASE day1117 DEFAULT CHARACTER SET utf8;

  5. 附2:若没有简历数据表,使用以下语句:

    CREATE TABLE myuser(
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(30),
        password VARCHAR(30),
        age INT,
        email VARCHAR(30),
        addr VARCHAR(30)
    );
    

编写PHP脚本

完成PHP连接MySQL的步骤,PHP有关MySQL数据库的扩展

mysqli_connect()函数
参数有5个:

  • host:指mysql数据库所在服务器的IP地址
  • username:指登录mysql数据库的用户名
  • passwd:登录mysql数据库的密码
  • dbname:数据库名
  • prot:端口号

返回值是一个mysqli_result类型的对象

附:mysqli_result类型的属性列表:

•mysqli_result — mysqli_result类
•mysqli_result::$current_field — Get current field offset of a result pointer
•mysqli_result::data_seek — Adjusts the result pointer to an arbitrary row in the result
•mysqli_result::fetch_all — Fetches all result rows as an associative array, a numeric array, or both
•mysqli_result::fetch_array — Fetch a result row as an associative, a numeric array, or both
•mysqli_result::fetch_assoc — Fetch a result row as an associative array
•mysqli_result::fetch_field_direct — Fetch meta-data for a single field
•mysqli_result::fetch_field — Returns the next field in the result set
•mysqli_result::fetch_fields — Returns an array of objects representing the fields in a result set
•mysqli_result::fetch_object — Returns the current row of a result set as an object
•mysqli_result::fetch_row — Get a result row as an enumerated array
•mysqli_result::$field_count — Get the number of fields in a result
•mysqli_result::field_seek — Set result pointer to a specified field offset
•mysqli_result::free — Frees the memory associated with a result
•mysqli_result::$lengths — Returns the lengths of the columns of the current row in the result set
•mysqli_result::$num_rows — Gets the number of rows in a result

过程化风格的连接步骤:

  1. 使用mysqli_connect()函数建立连接,该方法返回与数据库的连接对象,获取连接对象存入变量:
$conn=mysqli_connect('127.0.0.1','root','','myuser','3306');
var_dump($conn);
  1. 编写SQL语句字符串:
$sql="INSERT INTO myuser VALUES    (NULL,'miejueshitai','12345',86,'miejue@qq.com',emei')";
  1. 使用mysqli_query()函数执行SQL语句:

    $bool = mysqli_query($conn,$sql);

  2. 解析mysqli()函数返回的mysqli_result类型的对象;

  3. 关闭与MySQL数据库的连接,使用函数mysqli_close(连接对象)

    mysqli_close($conn);

面向对象风格的连接步骤

(注意数据库和数据表的名称要与自己的相符)

/*
    创建mysqli或者mysql对象,参见Mysql增强版本中的MySQLI类的构造器mysqli::__construct 
*/
$mysqli= new mysqli('localhost','root','','myuser');


if ($mysqli->connect_error) {
        die('Connect Error (' . $mysqli->connect_errno . ') '
        . $mysqli->connect_error);
}

echo 'Success... ' . $mysqli->host_info . "\n";

$sql="INSERT INTO myuser VALUES(NULL,'三丰道长','12345',86,'sanfeng@qq.com','武当')";


/*调用mysqli对象的query()方法,因为$mysqli对象中已经封装了连接信息,所以直接传sql语句作为参数即可
使用$mysql->query($sql)方法
query方法如果执行的是增删改操作,其返回值是一个布尔值;若是执行查询方法,其返回值是一个结果集对象*/
$mysqli->query('set names utf8');//设置编码
$mysqli->query($sql);



//关闭连接
$mysqli->close();

登录功能

废话不多说,直接上代码(注意数据库和数据表的名称要与自己的相符):

HTML页面(login.html):

<html>
<head>
    <meta charset="utf-8">
<head>
    <body>
        <form id="myform" method="post" action="login.php">
            <table>
                <tr>
                    <td>用户名</td>
                    <td><input type="text" id="username" name="username"></input></td>
                </tr>
                <tr>
                    <td>密码</td>
                    <td><input type="password" id="pwd" name="pwd"></input></td>
                </tr>
                <tr>
                    <td><input type="submit" value="submit"></td>
                    <td></td>
                </tr>
            </table>
        </form>
    </body>
</html>

PHP页面(login.php):

<?php
    $username=$_POST['username'];
    $pwd=$_POST['pwd'];
    // echo $username.','.pwd;
    $conn=mysqli_connect('127.0.0.1','root','','myuser','3306');
    // var_dump($conn);
    $sql="SELECT * FROM myuser WHERE name='"
        .$username
        ."' AND pwd='"
        .$pwd."'";

    //echo $sql;
    $result=mysqli_query($conn,$sql);

    /*result结果集无论有无记录,只要sql语句执行成功,即返回非空对象
    而在sql语句执行出错时就会返回false。所以我们不能简单地用$result对象存在与否来判断结果*/
    if($result->num_rows > 0){
        echo '登录成功';
    }else{
        echo '对不起,账户名密码不匹配';
    }
?>

注册功能

HTML页面:

<html>
    <head>
        <meta charset="utf-8"/>
        <title>注册</title>
    </head>

    <body>
        <form action="register.php" method="POST">
            <table> 
                <tr>
                    <td>姓名</td>
                    <td><input type="text" name="username"></td>

                </tr>
                <tr>
                    <td>密码</td>
                    <td><input type="pwd" name="pwd"></td>
                </tr>
                <tr>
                    <td><input type="submit"></td>
                    <!-- <td></td> -->
                </tr>
            </table>
        </form>
    </body>
</html>

PHP页面:

$username=$_POST['username'];
$pwd=$_POST['pwd'];
$mysqli=new mysqli('localhost','root','','myuser');
if($mysqli->connect_error){
       die('Connect Error (' . $mysqli->connect_errno . ') '
        . $mysqli->connect_error);
}
$sql1="SELECT * FROM myuser where name='$username'";
$mysqli->query('set names utf8');
$result = $mysqli->query($sql1);
if($result->num_rows>0){
    echo '这个名字已经存在,换个名字吧';
}else{
    $sql2="INSERT INTO myuser(name,pwd) values('$username','$pwd')";
    $rst=$mysqli->query($sql2);
    if($rst){
        echo '注册成功';
    }else{
        echo '注册失败';
    }
}

准备工作

安装XAMPP集成环境,启动apache。进入xampp安装目录下的htdocs目录,新建一个txt文件,重命名(F2)为以“.php”为扩展名的文件(比如test.php)。PHP语句写在<?php?>之间。语句书写完毕,保存后,在浏览器中输入http://localhost:88/test.php访问(端口号根据自己实际情况调整)即可。

<?php
    echo '这是一个PHP文件';
?>

常量与变量

常量

常量与javascript中一样,常量用const标示:
const str = ‘this is string.’;//定义一个常量
在PHP中,常量是不允许重复赋值的,例如执行:

str = 'abcdefg';
报错
 * * 错误信息
 *   Parse error: syntax error, unexpected '=' in

变量

PHP的变量以“$”开头,其用法与javascirpt中一致:

$str = 'this is string too.';
$str = 'abcdefg';
echo $str;//abcdefg

数据类型

四种标量类型:

  1. boolean
  2. integer
  3. float/double
  4. string

两种复合类型:

  1. array-数组
  2. object-对象

两种特殊类型:

  1. resource-资源
  2. NULL

两种打印方式:

echo 输出
var_dump 打印

$str='nihao';
echo $str;
/*
 * var_dump()函数
 * * 作用 - 打印变量的相关信息
 */
var_dump($str);

boolean

$boo = true;
echo $boo;//输出:1
var_dump($boo);//输出:bool(true)
$foo = fasel;
echo $foo;//输出:'',也即没有输出
var_dump($foo);//输出:bool(false)

integer

$integer = 100;
echo $integer;//100
echo '<br/>';
var_dump($integer);//int(100)

float/double

$f = 3.579;
echo $f;//3.579
echo '<br/>';    
var_dump($f);//float(3.579)

string

单引号和双引号都表示字符串,但两种方式用法不同。在单引号中的字符串,用法与其他语言相同,但在双引号下的字符串,是可以识别串中的变量名的,也因为匹配变量,其效率低于单引号下的字符串。

数组

定义一个数组

  1. 直接量

    $arr1=[1,2,3,4];
    var_dump($arr1);
    $arr2=['jimaoshiwang','zhaomin','zhangwuji'];
    var_dump($arr2);
    
  2. 定义索引数组

    格式:
    数组名=arr(
        索引值 => 值,
        索引值 => 值,
        ...
    );
    
    示例:
    $arr1=arr(
        0=>1,
        1=>2,
        2=>3
    );
    
  3. 定义关联数组

    格式:
    array(
        key(键) => 元素内容,
        key(键) => 元素内容,
        key(键) => 元素内容,
        ...
    );
    
    示例:
    $arr=array(
        '总理'=>'李克强',
        'boss'=>'习大大'
    );
    var_dump($arr);
    

类与对象

<?php
    // 定义一个类foo - 类似于javascript的构造器
    class foo{
        // 定义一个方法do_foo()
        function do_foo(){
            echo "Doing foo."; 
        }
    }
    // 通过new关键字实例化一个对象
    $bar = new foo;
    // 通过$bar对象,调用do_foo()方法
    $bar->do_foo();
?>

resource-资源

作用:用于保存外部资源的一个引用

使用场景:在文件上传中保存上传的文件


运算符

运算符基本与Javascript保持一致,字符串连接例外。
php中字符串连接使用”.”:

$zwj='zhangwuji';
$zzr='zhouzhiruo';
$str1=$zzr.' is '.$zwj.'\'s nvpengyou';//输出一个“'”要转义
echo $str1;//zhouzhiruo is zhangwuji's nvpenyou

循环

while循环

$i=0;
while($i<10){
    echo $i++;
}

for循环

$arr = [1,2,3,4,5];
for($i=0;$i<5;$i++){
    var_dump($arr[$i]);
}

foreach

foreach($arr as $i=>$value){
    var_dump($i);
    var_dump($arr[$i]);
    var_dump($value);
    echo '<br/>';
}

foreach是唯一与javascript中不同的循环,联系js中的for-in循环。

分支结构

与javascript几乎一致。

PHP预定义

预定义变量

  • $_GET
  • $_POST
  • $_REQUEST:$_GET、$POST等
  • $_FILE: 专用于文件上传
  • $_COOKIE: 接收客户端保存的所有cookie数据

box-sizing:

  • content-box
  • border-box

盒子模型的计算方式由box-sizing属性控制,有两个值content-boxborder-box。CSS中默认是前者,计算方式”盒子宽=margin+border+padding+width“;Bootstrap中默认是后者,计算方式为“盒子宽:margin+width”,border和padding都算在width中。

软件设计原则

1. 避免重复原则(DRY – Don’t repeat yourself)

编程的最基本原则是避免重复。在程序代码中总会有很多结构体,如循环、函数、类等等。一旦你重复某个语句或概念,就会很容易形成一个抽象体。

2. 抽象原则(Abstraction Principle )

与DRY原则相关。要记住,程序代码中每一个重要的功能,只能出现在源代码的一个位置。

3. 简单原则(Keep It Simple and Stupid )

简单是软件设计的目标,简单的代码占用时间少,漏洞少,并且易于修改。

4. 避免创建你不要的代码 Avoid Creating a YAGNI (You aren’t going to need it)

除非你需要它,否则别创建新功能。

5. 尽可能做可运行的最简单的事(Do the simplest thing that could possibly work)

尽可能做可运行的最简单的事。在编程中,一定要保持简单原则。作为一名程序员不断的反思“如何在工作中做到简化呢?”这将有助于在设计中保持简单的路径。

6. 别让我思考(Don’t make me think )

这是Steve Krug一本书的标题,同时也和编程有关。所编写的代码一定要易于读易于理解,这样别人才会欣赏,也能够给你提出合理化的建议。相反,若是繁杂难解的程序,其他人总是会避而远之的。

7. 开闭原则(Open/Closed Principle)

你所编写的软件实体(类、模块、函数等)最好是开放的,这样别人可以拓展开发。不过,对于你的代码,得限定别人不得修改。换句话说,别人可以基于你的代码进行拓展编写,但却不能修改你的代码。

8. 代码维护(Write Code for the Maintainer)

一个优秀的代码,应当使本人或是他人在将来都能够对它继续编写或维护。代码维护时,或许本人会比较容易,但对他人却比较麻烦。因此你写的代码要尽可能保证他人能够容易维护。用书中原话说“如果一个维护者不再继续维护你的代码,很可能他就有想杀了你的冲动。”

9. 最小惊讶原则(Principle of least astonishment)

最小惊讶原则通常是在用户界面方面引用,但同样适用于编写的代码。代码应该尽可能减少让读者惊喜。也就是说,你编写的代码只需按照项目的要求来编写。其他华丽的功能就不必了,以免弄巧成拙。

10. 单一责任原则(Single Responsibility Principle)

某个代码的功能,应该保证只有单一的明确的执行任务。

比如在bootstrap中,修饰一个元素,我们布局套一层div,定位套一层div,功能套一层,不同功能的逻辑用不同层的div来实现。

11. 低耦合原则(Minimize Coupling)

代码的任何一个部分应该减少对其他区域代码的依赖关系。尽量不要使用共享参数。低耦合往往是完美结构系统和优秀设计的标志。

12. 最大限度凝聚原则(Maximize Cohesion)

相似的功能代码应尽量放在一个部分。 High Cohesion, Low Coupling!

13. 隐藏实现细节(Hide Implementation Details)

隐藏实现细节原则,当其他功能部分发生变化时,能够尽可能降低对其他组件的影响。

14. 迪米特法则又叫作最少知识原则(Law of Demeter)

该代码只和与其有直接关系的部分连接。(比如:该部分继承的类,包含的对象,参数传递的对象等)。

15. 避免过早优化(Avoid Premature Optimization)

除非你的代码运行的比你想像中的要慢,否则别去优化。假如你真的想优化,就必须先想好如何用数据证明,它的速度变快了。
“过早的优化是一切罪恶的根源”——Donald Knuth

16. 代码重用原则(Code Reuse is Good)

重用代码能提高代码的可读性,缩短开发时间。

17. 关注点分离(Separation of Concerns)

不同领域的功能,应该由不同的代码和最小重迭的模块组成。

18. 拥抱改变(Embrace Change)

这是Kent Beck一本书的标题,同时也被认为是极限编程和敏捷方法的宗旨。
许多其他原则都是基于这个概念的,即你应该积极面对变化。事实上,一些较老的编程原则如最小化耦合原则都是为了使代码能够容易变化。无论你是否是个极限编程者,基于这个原则去编写代码会让你的工作变得更有意义。
作者简介:Christopher Diggins是加拿大一位有25年编程经验的资深技术人员,曾效力于Microsoft和AutoDesk,并创办过两家赢利的互联网公司。

JS中,带大括号的代码块中,唯有function(){}能创建作用域,这点与JAVA、C++等语言不一样。JS中的作用域只有两类:全局作用域与函数作用域。

浏览器在对代码进行解析时,会先进行变量声明和函数声明以及函数形参声明;所以就有了声明提前的说法。

JS最基础的GC方案比较简单:

  • 遍历所有可访问对象
  • 删除不可访问的对象

    和其他语言一样,javascript的GC策略也无法避免一个问题:GC时,停止响应其他操作,这是为了安全考虑。而Javascript的GC在100ms甚至以上,对一般的应用还好,但对于JS游戏,动画对连贯性要求比较高的应用,就麻烦了。这就是新引擎需要优化的点:避免GC造成的长时间停止响应。

优化:

  • 分代回收(Generation GC)

这个和Java回收策略思想是一致的。目的是通过区分“临时”与“持久”对象;多回收“临时对象”区(young generation),少回收“持久对象”区(tenured generation),减少每次需遍历的对象,从而减少每次GC的耗时。

  • 增量GC

这个方案的思想很简单,就是“每次处理一点,下次再处理一点,如此类推”。

JS垃圾回收GC博客
JS垃圾回收GC博客2
JS垃圾回收GC博客2