邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

php计算二维数组中某个key的集合
$array(类似于这个数组)
Array ( [0] => Array ( [id] => 3 [name]=>'aaa') [1] => Array ( [id] => 4 [name]=>'bbb') [2] => Array ( [id] => 13 [name]=>'ccc') );

方法1
$ids = array(); 
$ids = array_map('array_shift', $array); 

方法2(php>=5.5)
$ids = array(); 
$ids = array_column($array, 'id'); 

方法3
$names = array(); 
$names = array_reduce($array, create_function('$v,$w', '$v[$w["id"]]=$w["name"];return $v;')); 
Windows 下 yaf的安装

Windows 下 yaf的安装

1.先下载对应的php扩展(针对php版本)

http://pecl.php.net/package/yaf/2.2.9/windows

下载完成后,放到php/ext目录下

修改php.ini ,加入extension=php_yaf.dll,然后重启服务,查看phpinfo,yaf扩展是否安装成功

2.下载对应的程序包

https://github.com/akDeveloper/yaf_base_application

https://github.com/warmans/Yaf-PHP-Example

我用的是第二个例子测试的。

然后根据文档走就好了

http://www.laruence.com/manual/tutorial.firstpage.html

这个例子数据库用的sqlite,需要重新配置数据库

application/conf/application.ini文件中,屏蔽sqllite的配置。加入mysql的配置

;database

database.adapter = pdo_mysql

database.params.hostname = 127.0.0.1

database.params.port = 3306

database.params.dbname = test

database.params.username = root

database.params.password = 1314

database.params.charset = utf8

 

修改application/Bootstrap.php 61

$dbAdapter = new Zend_Db_Adapter_Pdo_Sqlite(

修改为

$dbAdapter = new Zend_Db_Adapter_Pdo_Mysql(

 

建立test数据库,blog数据表 (对应application/views/index 中的index.phtml里面读取的字段建)

 

 

thinkphp3.2同时支持mysql和mongodb

1.如果只是支持mysql,就不用说了,先说说只支持mongodb吧

在config.php中

<?php
return array(
//'配置项'=>'配置值'
'DB_TYPE'=>'mongo',
'DB_HOST'=> '127.0.0.1', 
'DB_USER'=>'',      
'DB_PWD'=>'',        
'DB_PORT'=>'27017',
'DB_NAME'=> 'test',     
 'DB_PREFIX'=> '',

);

新建一个TestModel.class.php文件

<?php
namespace Home\Model;
use Think\Model\MongoModel;
Class TestModel extends MongoModel{

}
?>

然后在控制器中 

$user =  D("users")->select();

var_dump($user);

就可以了。


2.同时支持mysql和mongodb

测试后发现只能以mogodb为主是可以使用的。

在config.php配置文件中

<?php
return array(
//'配置项'=>'配置值'
'DB_TYPE'=>'mongo',
'DB_HOST'=> '127.0.0.1', 
'DB_USER'=>'',      
'DB_PWD'=>'',        
'DB_PORT'=>'27017',
'DB_NAME'=> 'test',     
 'DB_PREFIX'=> '',

'DB_MYSQL' => array(
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'test, // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '1314', // 密码
'DB_PORT' => 3306, // 端口
'DB_PREFIX' => 'action_' // 数据库表前缀
),

);


然后mongodb的调用方法不变,mysql调用方法

mysql的可以这样:
$user = M('user','action_','DB_MYSQL')->select();
var_dump($user):


手册介绍地址:http://document.thinkphp.cn/manual_3_2.html#connect_db

PSR-0规范
PSR-0规范
1.命名空间必须与绝对路径一致
2.类名首字母必须大写
3.除入口文件外,其他的'.php'必须只有一个类
开发符合PSR-0规范的基础框架
1.全部使用命名空间
2.所有php文件必须使用自动载入,不能有include/require
3.单一入口
根目录下新建index.php文件,代码如下
<?php
define('BASEDIR',__DIR__);
include BASEDIR.'/Config/Loader.php';
spl_autoload_register('\\Config\\Loader::autoload');
IMooc\Object::test();
App\Controller\Home\Index::test();
?>

新建Config/Object.php
<?php
namespace Config;
class Object{
static function test(){
//echo "this is IMooc Object 方法"; 
}
}
?>

新建Config/Loader.php
<?php
namespace Config;
class Loader{
static function autoload($class){
require  BASEDIR.'/'.str_replace('\\','/',$class).'.php';
}
}
?>

新建App/Home/Index.php
<?php
namespace App\Controller\Home;
class Index{
static function test(){
echo "this is home php ";
//echo __METHOD__;
}
}
?>

------------------------------------------------

//工厂模式,工厂方法或者类生成对象 而不是在代码中直接new
//单例模式 ,使某个类的对象仅允许创建一个
//注册模式 ,全局共享和交换对象

//工厂模式
//新建Config/Factory.php
<?php
namespace Config;
class Factory{
static  function createDatabase(){
//$db = new Database;
$db = Database::getInstance();
Register::set('db1',$db);
return $db; 
} 
}
?>

//index.php调用
$db = Config\Factory::createDatabase();


//单例模式
//新建Config/Database.php
<?php
namespace Config;
class Database{
protected static $db;
private function __construct(){}
public static function getInstance(){
if(self::$db){ 
return  self::$db;
}else{
self::$db = new self();
}
}
function where($where){ 
return  $this; 
}
function order($order){ 
return  $this;
}
function limit($limit){ 
return  $this;
}
function test(){
echo 1;
}
}
?>

//index.php调用
$db = Config\Database::getInstance();
$db = Config\Database::getInstance();
$db = Config\Database::getInstance();
$db->test();

//注册模式
//新建Config/Register.php
<?php
namespace Config;
class Register{
protected static $objects;
function set($alias,$object){
self::$objects[$alias] = $object;
}
function get($name){
return self::$objects[$name];
}
function _unset(){
unset(self::$objects[$alias]);
}

}


php常用魔术方法
 //__construct 
  //构造函数 在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法。如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct() 。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。 
  class Animal{
    public function __construct() {
    $this->created = time();
    $this->logfile_handle = fopen('/tmp/log.txt', 'w');
    }
  }

  class Penguin extends Animal {
  }
  $tux = new Penguin;
  echo $tux->created;

  //__destruct 
  //析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
  //和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct() 。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。 
  //析构函数即使在使用 exit()  终止脚本运行时也会被调用。在析构函数中调用 exit()  将会中止其余关闭操作的运行。
  class Animal{
    public function __construct() {
      $this->created = time();
      $this->logfile_handle = fopen('/tmp/log.txt', 'w');
    }
    public function __destruct() {
      fclose($this->logfile_handle);
    }
  }

  //__get
  //读取不可访问属性的值时,__get() 会被调用。 
  //__set
  //在给不可访问属性赋值时,__set() 会被调用。 
 class  PropertyTest  {
    /**  被重载的数据保存在此  */
    private  $data  = array();
    /**  重载不能被用在已经定义的属性  */
    public  $declared  =  1 ;
    /**  只有从类外部访问这个属性时,重载才会发生 */
    private  $hidden  =  2 ;
    public function  __set ( $name ,  $value ){
        echo  "Setting ' $name ' to ' $value '\n" ;
        $this -> data [ $name ] =  $value ;
    }
    public function  __get ( $name ) {
      echo  "Getting ' $name '\n" ;
      if ( array_key_exists ( $name ,  $this -> data )) {
        return  $this -> data [ $name ];
      }
      $trace  =  debug_backtrace ();
        trigger_error (
             'Undefined property via __get(): '  .  $name  .
             ' in '  .  $trace [ 0 ][ 'file' ] .
             ' on line '  .  $trace [ 0 ][ 'line' ],
             E_USER_NOTICE );
        return  null ;
    }
  }
  $obj  = new  PropertyTest ;
  $obj -> a  =  1 ;
  echo  $obj -> a  .  "\n\n" ;

  //__call
  //在对象中调用一个不可访问方法时,__call() 会被调用。 
  //用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。 

  class  MethodTest {
    public function  __call ( $name ,  $arguments ) {
      // 注意: $name 的值区分大小写
      echo  "Calling object method ' $name ' ".  implode ( ', ' ,  $arguments ).  "\n" ;
    }
     /**  PHP 5.3.0之后版本  */
    public static function  __callStatic ( $name ,  $arguments ) {
      // 注意: $name 的值区分大小写
      echo  "Calling static method ' $name ' ".  implode ( ', ' ,  $arguments ).  "\n" ;
    }
  }
  $obj  = new  MethodTest ;
  $obj -> runTest ( 'in object context' );
  MethodTest :: runTest ( 'in static context' );   // PHP 5.3.0之后版本



  //__sleep
  //__sleep()方法会被调用当对象被序列化后,并允许你处理序列化。这有各种各样的程序,一个很好的例子如果一个对象包含某种类型的指针,例如文件句柄或引用另一个对象。当对象被序列化然后解序列化,这些引用类型是无用的,因为这些类型的引用的目标可能不再存在或有效。因此,最好是来取消这些信息在存储它们之前。

  //__wakeup
  //wakeup()是与__sleep()方法相反的,允许您更改对象解序列化的行为。和__sleep()一起使用,可以用来恢复被删除的句柄和对象当对象被序列化时。一个很好的例子程序是数据库句柄被取消设置当该项被序列化,然后恢复到当前配置中设置项目时,解序列化一个数据库句柄。

  //__clone
  //我们看过一个使用clone关键字的例子,在我的介绍从入门到oop的第二部分,创建对象的副本,而不是有两个变量指向同一个实际的数据。在一个类中重写此方法,我们可以观察发生了什么当在对象上使用clone关键字时,。虽然这是不是我们每一天能遇到的,一个漂亮的用例是创建一个真正的单例模式通过添加private访问修饰符给这个方法。

  //__toString
  //__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR  级别的致命错误。 
  // Declare a simple class
  class  TestClass{
    public  $foo ;
    public function  __construct ($foo) {
      $this -> foo  =  $foo ;
    }
    public function  __toString () {
      return  $this -> foo ;
    }
  }

  $class  = new  TestClass ( 'Hello' );
  echo  $class ;


ps:参考地址:

http://php.net/manual/zh/language.oop5.magic.php

http://www.oschina.net/translate/9-magic-methods-in-php?print

php屏蔽手机号和固话的中间四位
<?php 
	
	//php屏蔽手机号和固话的中间四位

	//php屏蔽手机号码的中间四位
	//方法1 利用正则
	$phone = 13811119999;
	echo preg_replace('/(1[3|4|5|6|7|8|9][0-9])[0-9]{4}([0-9]{4})/i','$1****$2',$phone);
	echo "<br>";
	//方法2 
	echo substr_replace($phone,'****',3,4);
	echo "<br>";

	//ps屏蔽固话中间四位
	$tel1 = "0632-2396517";
	$tel2 = "0632-2396517-083";
	echo preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i','$1****$2',$tel1);
	echo "<br>";
	echo preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i','$1****$2',$tel2);



?>
php标准库spl的文件处理函数
SplFileInfo用于获得文件的基本信息,比如修改时间、大小、目录等信息

SplFileObject用户操作文件的内容,比如读取、写入

<?php
header("Content-type:text/html;charset=utf-8");
date_default_timezone_set('PRC');
$file = new SplFileInfo('studynote/imooc.txt');
echo "文件创建时间:".date('Y-m-d H:i:s',$file->getCTime())."<br>";
echo "文件最后修改时间:".date('Y-m-d H:i:s',$file->getMTime())."<br>";
echo "文件大小:".$file->getSize()."字节<br>";
//读取文件内容
$fileObj = $file->openFile('r');
while($fileObj->valid()){
echo $fileObj->fgets();//fgets函数获取文件里面的一行数据
}
$fileObj = null;//用户关闭打开的文件
$file = null;

?>

php标准库spl函数的使用(Autoload)
为了初始化php中的类对象,需要通过一定的方法寻找到类的定义。通常情况下,类会定义在一个单独的文件中。
Autoload就是php找到这类文件的方法。
spl函数的使用->类载入基本流程
开始->当前文件找类->找到->初始化类
开始->当前文件找类->未找到->依次调用spl_autoload_register注册的方法找类->找到->初始化类
开始->当前文件找类->未找到->依次调用spl_autoload_register注册的方法找类->未找到->文件的__autoload函数找类
//类文件放在lib文件夹下test.php,test.class.php
1.autoload01.php 
<?php
define('CLASS_DIR', 'lib/');
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);//设置autoload寻找php定义的类文件的目录,多个目录用PATH_SEPARATOR进行分隔
//spl_autoload_extensions('.class.php');//
spl_autoload_extensions('.class.php,.php');//设置autoload寻找php定义的类文件的扩展名,多个扩展名用逗号分隔,前面的扩展名优先被匹配
spl_autoload_register();//提示php使用autoload机制进行查找自定义
$obj = new Test();
?>
2.autoload02.php
<?php
function __autoload($class_name){//定义__autoload函数,可以在不调用spl_autoload_register函数的情况下完成类的装载
echo "__autoload class:".$class_name."<br>";
//require_once("lib/".$class_name.".php");
require_once("lib/".$class_name.".class.php");//装载类
}
//定义一个替换__autoload函数的类文件装载函数
function classloader($class_name){
echo "classloader() load class: ".$class_name."<br>";
require_once("lib/".$class_name.".php");//装载类
}
spl_autoload_register('classloader');//传入定义好的装载类的函数的名称替换__autoload函数
$obj = new Test();
?>
3.autoload03.php 
<?php
//定义一个替换__autoload函数的类文件装载函数
function classloader($class_name){
echo "classloader() load class: ".$class_name."<br>";
set_include_path('lib/');
spl_autoload($class_name);//当我们不用require或者require_once载入类文件的时候,而想通过系统查找include_path来装载类时,必须显示调用sp_autoload函数,参数是类的名称来重启类文件自动查找(装载)
}
spl_autoload_register('classloader');//传入定义好的装载类的函数的名称替换__autoload函数

$obj = new Test();

?>

优惠券
最新微语