2017年12月

在Ubuntu终端里执行安装操作时出现以下错误,提示无法锁定管理目录。
Error:

E: 无法获得锁 /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?



- 阅读剩余部分 -

<?php

echo "OK";

// phpinfo();
//取得指定位址的內容,並儲存至text  
$text=file_get_contents('https://www.yidaiyilu.gov.cn/info/iList.jsp?cat_id=10360');  

$text=str_replace(array("\r","\n","\t","\s"), '', $text); 
// var_dump($text);
//取出div標籤且id為PostContent的內容,並儲存至陣列match  


preg_match('/<div[^>]*class="list_right left"[^>]*>(.*?) <\/div>/si',$text,$match);

preg_match('/<ul[^>]*class="commonList_dot"[^>]<li[^>]*>(.*?) <\/div>/si',$text,$match);

<ul class="commonList_dot"><li>
                                                   

preg_match('/<li[^>]*>/Ui', $match[0], $m);


  
//印出match  
//print_r($match);
/*
$length = count($match);
while ($i <= $length) {
 echo($match[$i]);
 $i++;
}

*/
?>

决定扔掉那些集成开发环境,今后的学习和开发均在vagrant+virtual+ubuntu下完成。vagrant的搭建可以说是非常快捷了,其原理就是将依赖环境搭建在虚拟机中,然后将本地文件(宿主机)映射到虚拟机并实现访问。即便如此,在搭建过程中依然有不少的坑要填。

安装vagrant 和 virtualbox

日常的工作和学习,我基本上都是在win7和MacOS下完成的,因此使用vagrant可以帮助我非常容易的实现在不同系统下部署完全一致的开发环境。
之所以在2017年的今天还在使用Ubuntu 14.04是因为这台Win7机器下只有低于Ubuntu14.04(含)的版本的Box盒子才能正常跑起来,主要是受vagrant版本太低的限制。
win7 下应当采用vagrant 1.9.3+ Virtualbox 5.1.3的组合,否则会出现各种像无法启动box,启动box后卡在密钥验证那里无法进入系统等奇葩问题,官方给出的解释是,win7最高支持到1.9.3。
Mac 10.12 下可以直接安装最新版,直接去官网下载最新的DMG安装包安装就好。

目录设置

 └─trusty32  
     ├─.vagrant
     │  └─machines
     │  └─default
     │  └─virtualbox
     └─www   # 共享目录,宿主机文件和虚拟机同步目录

Vagrantfile配置(分配IP和共享目录)

config.vm.network "private_network", ip: "192.168.33.20" 指定虚拟机IP为 192.168.33.20

config.vm.synced_folder "./www", "/vagrant/www/", :mount_options => ["dmode=777","fmode=777"] 分配共享目录,即trusty32下的www的目录挂载在虚拟机/vagrant/www目录下。

vagrant和virtualbox的安装非常简单,不再赘述。主要记录ubuntu 14.04下搭建PHP7+Mysql+Apache2.4+Adminer的过程:

安装Apache

更新镜像源:sudo apt-get update && sudo apt-get upgrade

安装Apache2.4: sudo apt-get install apache2。安装完成在浏览器输入192.168.33.20,看到Apache2 Ubuntu Default Page: It Works!则说明Apache2安装成功。

安装 Mysql

wget http://dev.mysql.com/get/mysql-apt-config_0.6.0-1_all.deb 下载MYSQL5.7安装包
sudo dpkg -i mysql-apt-config_0.6.0-1_all.deb 添加到库
sudo apt-get update 更新软件源
sudo apt-get install mysql-server 安装Mysql服务

安装过程中会要求输入root密码。

安装完成后输入 mysql -uroot -p登入Mysql服务器验证是否成功安装了mysql服务

安装PHP7.0

sudo apt-get install php7.0 php7.0-cli php7.0-fpm php7.0-gd php7.0-json php7.0-mysql php7.0-readline php7.0-xml php7.0-mbstring php7.0-curl

整合

整合PHP与Mysql

sudo apt-get install php7.0-mysql

整合PHP与Apache
sudo apt-get install libapache2-mod-php7.0
重启Apache sudo service apache2 restart

验证

在apache默认网页目录下新建info.php
sudo vi info.php

<?php
echo mysqli_connect('localhost','root','root')?"数据库连接成功":"数据库连接出错";
phpinfo();

/*
# 单例设计模式
*/


class multiObj{
    public function __construct(){
        echo " DataBase Linked <br />";
    }
    public function select(){
        echo "select *";
    }
}

$obj1 = new multiObj(); # 生成 Obj#1
$obj2 = new multiObj(); # 生成 Obj#2
$obj3 = new multiObj(); # 生成 Obj#3
var_dump($obj1);
var_dump($obj2);
var_dump($obj3);



/* 单例设计模式,可以防止类被多次的实例化 */

class singleObj{
        static $obj = null; # 用来标记实例,默认不存在
        private function __construct(){
            echo "<br />DataBase Linked<br/>";
        }
        static function getObj(){
            if(is_null(self::$obj)){  # 判断实例是否存在
               self::$obj = new self(); 
               #不存在则实例化类生成实例 , singleObj()换成self()
            }
             return self::$obj;  # 存在实例,直接返回实例
        }
        public function select(){
            echo "select *";
        }
}

$sobj1 = singleObj::getObj(); # 不存在实例 生成Obj #4
$sobj2 = singleObj::getObj(); # 存在实例 返回Obj #4
$sobj3 = singleObj::getObj(); # 存在实例 返回Obj #4
var_dump($sobj1);
var_dump($sobj2);
var_dump($sobj3);

为了防止对象从外部克隆时生成重复对象,还应当增加一个private function __clone(){}方法。
基本上,要实现单例模式,需要禁用构造方法和克隆方法,禁用的方法也很简单,只要加上private 修饰即可。

<?php

include '../config.php';

class getData{

    public $table;
    public $db;
    public  $link;

    public function __construct($table){
        
        $this->table = $table;
        $this->link = mysql_connect(DBHOST,DBUSER,DBPWD,DBNAME); 
        $this->db = mysql_select_db(DBNAME,$this->link);
       
    }

    private function query($query){  // 基础组件 执行SQL语句
        mysql_query("SET NAMES utf8");
        return mysql_query($query,$this->link);
    }

    public function get($limit){ // 功能: 获取条数为$limit条包含全字段数据的数据

        $query = "SELECT * FROM `".$this->table."`LIMIT 0 , $limit";
        $result = $this->query($query);
        return $this->toArray($result);
    }

    private function toArray($source){ // 基础组件 根据查询语句将数据打包成数组
       
        $arr = array();
        while($row = mysql_fetch_array($source)){
            $arr[] = $row;
        }
        return $arr;
    }
}


class read extends getData{
   
    function getDataArray($table,$limit){
        $data = new getData($table);
        return $data->get(10);
    }
}


$d =read::getDataArray('categories',10);
print_r($d);


# $d = getDataArray('categories',10); // 从表categories中获取包含10条全字段数据的数组
# print_r($d);

final 关键字

出于安全考虑,被final修饰的类无法继承,被final修饰的方法无法被重写,关键字final只能用来修饰类和方法。

class parentClass{

    final public function show(){
        echo "This is a class named parentClass";
    }

}

class childClass extends parentClass{

    public function show(){
        echo "This is a class named childClass";
    }

}

childClass::show();

/* 
#
# final 关键字只能用来修饰类和方法,final 修饰的类不能被继承,
# final 修饰的方法不能被重写
#
*/

以上代码输出:

Fatal error: Cannot override final method parentClass::show() in *_class.php on line 17

static 关键字

static 可以用来修饰成员属性和成员方法,以声明该属性和方法为静态,静态属性和静态方法不需要实例化即可访问,访问方法为类名::$静态属性|静态方法()

在类的内部引用静态属性和静态方法时,不可使用$this->$属性|方法(),而应该使用self::$属性|方法()。换句话说,如果类中的成员属性和成员方法使用了static修饰的话,如果需要在类的其他方法中引用它们,就必须使用self::$属性|方法()来调用。

const 关键字

如果需要在类的内部定义常量,则需要使用const关键字,其基本语法是 const CONSTANT = 'CONSTANT VALUE';。在类的内部访问常量则需要定义专有方法,在类的外部访问常量和访问及静态属性类似,只要使用类名::CONSTANT即可。

instanceof 关键字

这个关键字用来判断当前对象是否是某个类实例化而来,其基本语法是 $obj instanceof Class,会返回一个布尔结果。

__set() 方法

class person{

    public $name;
    private $weight;
    protected $age;

    public function __construct($name,$weight,$age){
        $this->name = $name;
        $this->weight = $weight;
        $this->age = $age;
    }

    /*
    public function set($name,$value){ // 此处的$name 和属性$name 不同注意理解区分
        $this->$name = $value; // 注意$this->$name 中的$name的意义
        return $this->$name;
    }
    */

    # 自动调用 无需手工书写如$p->set($varName,$varVaule) 
    public function __set($name,$vaule){ 
         
        $this->$name = $vaule;
    }
    

    public function property(){
        echo "The weight for {$this->name}  is {$this->weight} kg , his age is {$this->age} years old " ;
    }

}

$bushou = new person('bushou',87,28);

/* 
# 手工调用set()方法
$bushou->set('weight',60);
$bushou->set('age',18);
var_dump($bushou); // 对象赋值之后,并不能使用$this->age或者$this->weight直接取到数据
*/

# 自动触发__set()方法
$bushou->weight = 60;
$bushou->age = 19;
var_dump($bushou);

以上代码运行后会输出:

object(person)#1 (3) {
["name"]=> string(6) "bushou"
["weight":"person":private]=> int(60)
["age":protected]=> int(19)
}

之前自己摸索着学习过一段时间的PHP编程,也尝试开发出了基于过程的单用户博客系统Slience. 由于想涉足大中型项目的实战开发,之前学习的那点皮毛根本是杯水车薪,于是趁着工作任务不重,打算系统的学习一下PHP开发。太过基础的内容并没有记在这里,因为都很容易掌握,关于面向对象的解释和理论也并没有放在这里,这里可能要花几篇的篇幅来记录一下对OOP开发过程中会常用到的一些方法和函数的理解。

- 阅读剩余部分 -

最近的开发学习全部转入了Vagrant下,不得不说vagrant真的是神器,除了首次配置麻烦点之外,迁移起来还真是方便,这里记录一下如何在一个minimal的ubuntu12.04下配置Apache2服务器的详细方法。

- 阅读剩余部分 -