抽象类

在类中,如果至少有一个方法,没有方法体,直接以分号结束,

那么这个方法叫抽象方法,必须加abstract修饰方法;

包含抽象方法的类就叫抽象类,要用abstract来修饰;

不是所有抽象类必须包含抽象方法,但有抽象方法的类肯定是抽象类

作用:

不能直接实例化对象来使用;不能使用;

对子类起到约束作用

用法:创建一个类去继承这个抽象类,并定义覆盖父类的所有抽象方法;

代码部分:

 /*
        抽象类:在一个类中至少有一个方法,没有方法体,直接以分号结束;
                那么这个方法就是抽象方法,必须要有abstract来修饰;
                包含有抽象方法的类就叫抽象类;
                ps:不是所有的抽象类都必须包含抽象方法;
     
                作用:不能直接实例化对象来使用抽象类;
                     对子类有约束作用;
                用法:要想使用抽象类就必须创建一个类去继承这个抽象类,并定义覆盖父类的抽象方法;
        */
            //声明一个抽象类,对子类进行约束
            abstract class Person{
                public $name="张三";
                public $country="美国";
                abstract public function eat();//定义一个吃的抽象方法
                abstract public function say();//定义一个说话的抽象方法
                public function run(){//在抽象类中也可以定义非抽象方法
                    echo '我正在走路.......';
                }
            }
     
            //定义一个子类去继承抽象类,并实现抽象方法;
            //子类中要想实现对象,需要将抽象类中所有的抽象方法都覆盖重写
            class USAER extends Person{
                public function eat(){//将父类中的抽象覆盖,并随自己实现任意功能
                    echo $this->country.'的'.$this->name.'用筷子吃饭<br/>';
                }
                public function say(){//将父类张的抽象覆盖,实现
                    echo $this->country.'人说英语';
                }
                public function sing(){//该子类中可以有非抽象的方法
                    echo '我正在唱歌......';
                }
            }
            $usa=new USAER();
            $usa->eat();//输出美国的张三用筷子吃饭
            $usa->say();//输出美国人说英语
            $usa->sing();//子类中的非抽象方法不受影响
     


接口

如果在一个抽象类中只有抽象方法和常量,可以将其定义为接口(interface);
注意:接口类不能使用anstract来修饰;
作用:
不能直接使用,对子类起到约束作用;
抽象类中可以有非抽象方法,而接口类中全是抽象方法;
用法:用implements来实现接口的使用
ps:一个类只能有一个父类,但是一个类可以实现多个接口
代码部分:

<?php
 /*
 接口(interface):当一个类中,只有抽象方法和常量,那么可以定义为接口;
     定义格式:interface 接口名{}
     接口方法不能使用abstract来修饰;
     作用:不能直接使用,对子类进行约束;
     抽象类中可以有非抽象方法,而接口中全是抽象方法;
     使用:implements实现接口
      
     ps:一个类只能有一个父类,但是一个类可以实现多个接口
 */
      
     interface One{//定义一个接口
         const ASD='接口类中可以有常量';//接口类可以有常量
         public function AA();
         public function BB();
     }
     abstract class Two implements One{//实现接口的类
         public function AA(){//只实现了一个方法,还有一个二分法没有实现,必须定义为抽象类
             echo '如果不是全部实现,则Two类还是一个抽象类';
         }
     }
     class Three extends Two{//继承Two这个抽象类,
         public function BB(){//two是one的子类,一个抽象方法已经实现了,在这里还有一个需要实现
             echo '这儿是BB';
         }
     }
     $a=new Three();//实例化对象
     $a->AA();//如果不是全部实现,则Two类还是一个抽象类
     $a->BB();//这儿是BB
         //在定义三个接口类,
     interface AAA{
         public function AAA();
     }
     interface BBB{
         public function BBB();
     }
     interface CCC{
         public function CCC();
     }
     //定义一个类来实现以上三个接口
     //一个类可以实现多个接口;
     class Myimp implements AAA,BBB,CCC{
         function AAA(){
             echo '这里是AAA';
         }
         function BBB(){
             echo "这里是BBB";
         }
         function CCC(){
             echo "这是CCC";
         }
     }
     $b=new myimp();
     $b->BBB();//这里是BBB


多态性

对于同一个方法,传入不同的对象,实现了不同的结果,就是多态的表现;
一段程序可以处理不同对象的能力
代码部分:

    <?php
    /*
    多态:一种方法;传入不同的对象,会有不同的处理结果
        方法一样,所以我们使用接口约束子类中的方法
        php中的多态,大多指的是重写,需要方法名一样
    */
    //定义说话接口类
    interface SAY{
        function say();
    }
    class Ms implements SAY{//定义美国人说话类
        function say(){
            echo "美国人说英语";
        }
    }
    class CHR implements SAY{//定义中国人说话类
        function say(){
            echo "中国人说汉语";
        }
    }
    class JPn implements SAY{//定义日本人说话类
        function say(){
            echo "日本人说日语";
        }
    }
    class start{//定义一个开始说话的类,调用say();
        function startsay($who){
            $who->say();//对象不同,方法一样
        }
    }
    $a=new start();
    $a->startsay(new JPn);//日本人说日语,  //new JPn 一个日本类说话的对象
    $a->startsay(new CHR);//中国人说汉语
    $a->startsay(new Ms);//美国人说英语

面向对象
对象

具有一定功能和特征的事物就是对象
能满足某种需求的事物就是对象
对象就是一个具体的东西

具有相同功能和特征的对象的抽象就是类;思想上的
类就是一系列的东西和过程的一种总结和抽象
对象和类之间的关系

我们在使用过程中,不能直接使用类,而是需要一个而具体的对象,根据类来产生对象,
对象是由类产生的;
类的声明

class 类名 {}
成员属性(成员变量)

指的是一些特性,姓名,年龄,性别,是可变的;
注意: 1,成员属性在声明是必须加修饰符(3p)
2,成员属性的初始值可有可无;
3,成员属性在赋值时不能使用变量及函数调用
4,成员属性在赋值时可使用常量,运算
成员方法(成员函数)

指的是一些功能,行为,动作。他就是函数;
注意: 1,在定义成员方法时修饰符可有可无,如果不加默认public;
2,参数可有可无
3,返回值可有可无;
对象的实例化

格式:$var=new 类名()
对象->属性

对象访问符,相当于汉语中的 ‘的’;
对象访问成员属性时,不要加$,除非是可变变量;
对象赋值:$object -> 成员属性 = ‘值’;
$this 关键字

this本上就有这个的意思
$this在成员方法中使用,代表的是当前类的这个对象;
哪个对象来调用当前这个方法,$this就代表哪个对象;
调用这个方法前的对象是谁,$this就是代表谁;
构造方法

构造方法是一个特殊的成员方法
构造方法不需要对象加成员访问符来调用
当用new 关键字类实例化对象的时候会自动触发构造方法
方法名:__construct
与类名同名的方法也称之为构造方法
作用:初始化当前对象
析造方法

当该类对象在销毁时,自动触发
方法名:__destruct
销毁的几种情况:脚本执行完;unset;重新赋值;

以下是代码部分:

<?php
     
    //定义一个类;
    class Person{
        //成员属性
        public $name;
        public $age;
        public $sex;
 
        //构造方法
        public function __construct($n,$a,$s){//__construct在new 一个对象是自动触发,初始化属性
            $this->name=$n;//$this 只能用在成员方法中,指的是当前的这个对象;
            $this->age=$a;
            $this->sex=$s;
        }
 
        //成员方法
        public function test(){
            echo "成员方法就是成员函数";
        }
 
        //析构方法
        public function __destruct(){//析构方法不需要任何参数
            echo "析构方法在对象销毁时自动触发";
        }
    }
 
    //实例化对象,类不能直接用,而是通过实例化出一个而对象,用的是对象
    $a=new Person();
 
    echo $a->name;//访问成员属性
    $a->test();//调用成员函数
 

0、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的\函数"(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

2、$row["id"] 的速度是$row[id]的7倍。

3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

5、注销那些不用的变量尤其是大数组,以便释放内存。

6、尽量避免使用__get,__set,__autoload。

7、require_once()代价昂贵。

8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。

阅读全文 »

1 设计数据库表

sql 在已有的数据库里创建user表,id,username,password三个字段享

create table user(id int(10) not null auto_increment,username varchar(30),password varchar(40),primary key(id));

2 connect.php 数据库配置文件

<?php
    $server="localhost";//主机
    $db_username="";//你的数据库用户名
    $db_password="";//你的数据库密码

    $con = mysql_connect($server,$db_username,$db_password);//链接数据库
    if(!$con){
        die("can't connect".mysql_error());//如果链接失败输出错误
    }
    
    mysql_select_db('test',$con);//选择数据库(我的是test)
?>

3 signup.html 注册表单

<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户注册页面</title>
    </head>
    <body>
        <form action="signup.php" method="post">
            <p>用户名:<input type="text" name="name"></p>
            <p>密  码: <input type="text" name="password"></p>
            <p><input type="submit" name="submit" value="注册"></p>
        </form>
    </body>
</html>

4 signup.php 注册程序

<?php 
    header("Content-Type: text/html; charset=utf8");

    if(!isset($_POST['submit'])){
        exit("错误执行");
    }//判断是否有submit操作

    $name=$_POST['name'];//post获取表单里的name
    $password=$_POST['password'];//post获取表单里的password

    include('connect.php');//链接数据库
    $q="insert into user(id,username,password) values (null,'$name','$password')";//向数据库插入表单传来的值的sql
    $reslut=mysql_query($q,$con);//执行sql
    
    if (!$reslut){
        die('Error: ' . mysql_error());//如果sql执行失败输出错误
    }else{
        echo "注册成功";//成功输出注册成功
    }

    

    mysql_close($con);//关闭数据库



注册流程完成,下面是用户登录

5 login.html 登录表单

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆</title>
    </head>
    <body>
        <form name="login" action="login.php" method="post">
                <p>用户名<input type=text name="name"></p>
                <p>密 码<input type=password name="password"></p>
                <p><input type="submit" name="submit" value="登录"></p>
            </form>
    </body>
</html>

6 login.php 登录程序

<?PHP
    header("Content-Type: text/html; charset=utf8");
    if(!isset($_POST["submit"])){
        exit("错误执行");
    }//检测是否有submit操作 

    include('connect.php');//链接数据库
    $name = $_POST['name'];//post获得用户名表单值
    $passowrd = $_POST['password'];//post获得用户密码单值

    if ($name && $passowrd){//如果用户名和密码都不为空
             $sql = "select * from user where username = '$name' and password='$passowrd'";//检测数据库是否有对应的username和password的sql
             $result = mysql_query($sql);//执行sql
             $rows=mysql_num_rows($result);//返回一个数值
             if($rows){//0 false 1 true
                   header("refresh:0;url=welcome.html");//如果成功跳转至welcome.html页面
                   exit;
             }else{
                echo "用户名或密码错误";
                echo "
                    <script>
                            setTimeout(function(){window.location.href='login.html';},1000);
                    </script>

                ";//如果错误使用js 1秒后跳转到登录页面重试;
             }
             

    }else{//如果用户名或密码有空
                echo "表单填写不完整";
                echo "
                      <script>
                            setTimeout(function(){window.location.href='login.html';},1000);
                      </script>";

                        //如果错误使用js 1秒后跳转到登录页面重试;
    }

    mysql_close();//关闭数据库
?>

7 welcome.html 登录成功跳转页面

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆成功</title>
    </head>
    <body>
        欢迎光临
    </body>
</html>

至此一个简单的完整的注册登录系统完成,代码很简单没有考虑验证安全性健壮性,后面会一步步完善,使之强大

创建数组
在JavaScript多种方式创建数组

构造函数

1.无参构造函数,创建一空数组

var a1=new Array();

2.一个数字参数构造函数,指定数组长度(由于数组长度可以动态调整,作用并不大),创建指定长度的数组

var a2=new Array(5);

3.带有初始化数据的构造函数,创建数组并初始化参数数据

var a3=new Array(4,'hello',new Date());

字面量

1.使用方括号,创建空数组,等同于调用无参构造函数

var a4=[];

2.使用中括号,并传入初始化数据,等同于调用调用带有初始化数据的构造函数

var a5=[10];

注意点

1.在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组,如果传入多个,则创建一个数组,参数作为初始化数据加到数组中

var a1=new Array(5);
            console.log(a1.length);//5
            console.log(a1); //[] ,数组是空的

            var a2=new Array(5,6);
            console.log(a2.length);//2
            console.log(a2); //[5,6]

但是使用字面量方式,无论传入几个参数,都会把参数当作初始化内容

var a1=[5];
            console.log(a1.length);//1
            console.log(a1); //[5]

            var a2=[5,6];
            console.log(a2.length);//2
            console.log(a2); //[5,6]

2.使用带初始化参数的方式创建数组的时候,最好最后不要带多余的”,”,在不同的浏览器下对此处理方式不一样

var a1=[1,2,3,];
console.log(a1.length);
console.log(a1);

这段脚本在现代浏览器上运行结果和我们设想一样,长度是3,但是在低版本IE下确实长度为4的数组,最后一条数据是undefined

阅读全文 »