Jun 7

<script language="javascript">
  //demo1 对象创建及动态添加方法 @F
  Function.prototype.method=function(name,fn){
    this.prototype[name]=fn;
    return this;
  }
  var Demo1 =function(){
    
  };
  Demo1.method('start',function(){alert('start');}).method('end',function(){alert('end');});
  Demo1.prototype.run=function(){
    alert('run');
    this.start();
    this.end();
  };
  
  var myDemo1=new Demo1();
  myDemo1.run();
  
  //demo2   匿名函数
  var Demo2=(function(a,b){
    return a*b;
  })(2,3);
  alert(Demo2);
  
  //demo3 闭包
  var demo3;
  (function(){
    var a=2;
    var b=4;
    demo3=function(){
      return a*b;
    };  
  })();
  alert(demo3());
  
  //demo4 对象的易变性
  var person=function(name,age){
    this.name=name;
    this.age=age;
  }
  person.prototype={
    getName:function(){
      return this.name;
    },
    getAge:function(){
      return this.age;
    }
  }
  var poly=new person('poli',16);
  var jason=new person('jason',26);
  //给所有person对象加一个getMsg方法
  person.prototype.getMsg=function(){
    return this.getName()+' is '+this.getAge()+' years old';
  }
  //只给jason这个人加一个showMsg方法
  jason.showMsg=function(){
    alert(this.getMsg());
  }
  jason.showMsg();
  
  //demo5 属性检查模仿接口
  var Com = function(){
    //给属性implomentsInterfaces添加ccc和FFF接口 [约定]Com实现了这2个接口 但是未能保证...
    this.implomentsInterfaces = ['CCC','FF'];
    //自动检查函数
    function _init(){
      if(!implements(this,'CCC','FFF')){
        throw new Error('Com is not implement all the interface');
      }
    };
    //最后进行
    _init();
  }
  //自定义一个通用的属性检查函数 双循环匹配对象和接口
  function implements(obj){
    for(var i=1;i<arguments.length;i++){
      var interFound=false;
      for(var j=0;j<obj.implomentsInterfaces.length;j++){
        if(obj.implomentsInterfaces[j]==arguments[i]){
          interFound=true;
          break;//找到了跳出循环
        }
      }
      if(interFound==false){
        return false;
      }
    }
    return true;
  }
  //看看效果:
//  Com();
  
  //demo6 鸭式检查类是否实现接口(原理就是判断一个类是否具有所有[所有其声明实现的接口所具有的函数],缺少一个就判断错误)
  
  //demo7 作用域 内嵌函数 闭包
  function demo7(){
    var b=1;
    function bar(){
      b*=2;
      return b;
    }
    return bar;
  }
  var myDemo7=demo7();
  alert(myDemo7()); //2
  alert(myDemo7()); //4 同一个实例 运行多次 同时改变了其内部私有变量的值
  var _myDemo7=demo7();
  alert(_myDemo7());//2
  
  //demo8 继承破坏封装 缺点:占内存,破坏继承
  /**
  几个概念:
  1.局部变量
   函数内部声明的变量 (var)
  2.私有函数(内嵌函数)
   函数内部声明的函数,不能被外部直接使用(function形式声明)
  3.特权函数
   函数内部声明的函数,可以被外部使用(this.形式声明),可以使用函数的私有成员
  4.prototype函数
  函数外部声明的函数,不能访问函数的私有成员
  */
  var Demo8=function(newA){
    var a;//@1
    function checkA(){ //@2
      return true;
    }
    this.getA=function(){ //@3
      return a;
    }
    this.setA=function(newA){
      a= newA;
    }
    this.setA(newA);
  };
  Demo8.prototype={
    display:function(){//@4
      alert(this.getA());
    }
  };
  var mydemo8=new Demo8(1);
  alert('下面是例子8:');
  mydemo8.display();//1
  mydemo8.setA(2);
  mydemo8.display();//2
  
  /*
   1.虽然js是面向对象的,但js自身无私有属性,公有方法,常量的说法 都是靠作用域进行代码模拟实现的。
   2.js的面向对象实质是一种松散的序列(数据结构),可以随时修改添加方法和属性
   */
  
  //demo9 类式继承 @F
  /*
  1.为了让子类继承父类,只需将子类的prototype设置为父类的一个实例就;
  2.同时将子类的constructor重新设置为子类。
  3.同时需要了解一下CALL函数,superclass.call(this,param);
  在subclass中通过此句调用superClass的构造函数,同时传递参数进去。
  下面封装了js继承的一个函数
  */
  function extend(subClass,superClass){
    var F=function(){};
    F.prototype=superClass.prototype;
    subClass.prototype=new F();//@1
    subClass.prototype.constructor=subClass;//@2
    //为子类新加一个父类属性
    subClass.superclass=superClass.prototype;
    //如果父类的constructor 与当前对象的constructor相等,则重设父类constructor
    if(superClass.prototype.constructor==Object.prototype.constructor){
      superClass.prototype.constructor=superClass;
    }
  }
  
  //demo10 原型式继承
  /*
  *  通过自定义的一个克隆类将原型(父类),拷贝给子类
  */
  var Person={  //一个原型 (父类)
    name:'defalut name',
    getName:function(){
      return this.name;  
    }  
  };
  //自己定义一个克隆函数@F
  function clone(obj){
    function F(){};
    F.prototype=obj;
    return new F;
  }
  var Author=clone(Person);//通过克隆进行继承(子类)
  Author.books=[];  //设置新的属性
  Author.getBooks=function(){//设置新的方法
    return this.books;
  }
  //使用例子
  var author=[];
  author[0]=clone(Author);
  author[1]=clone(Author);
  author[0].name='name0';
  author[1].name='name1';
  author[1].books=['json depater'];
  alert(author[0].getName());
  alert(author[1].getBooks());
  
  //demo11 掺元类 @F
  /*
  即将父类函数(或者指定函数)扩充到多个不同的类中,让这些类公用该函数.
  主要涉及一个自定义的扩充函数 augment(a,b) 将a中的方法扩充到b
  原理:首先定义一个方法集(类),然后通过augmen函数将该方法集作为第二个参数传入,将方法集中的方法赋值给实际类(第一个参数)
  */
  function augment(rClass,gClass){
    if(arguments[2]){
      for(var i=2,len= arguments.length;i<len;i++){
        rClass.prototype[arguments[i]]=gClass.prototype[arguments[i]]
      }
    }else{
      for(m in gClass.prototype){
        if(!rClass.prototype[m]){
          rClass.prototype[m]=gClass.prototype[m];
        }
      }
    }
  }
  
</script>  
May 22
1.桥接宿主机 与 vbox网络,并设置网桥ip4 如192.168.18.105
2.vbox虚拟机的网络链接 需要是host-only adapter,并且选中网线链接
3.进入虚拟机系统后设置ip4 如: 192.168.18.106

这样在宿主机就能ping通虚拟机了,只要虚拟机里面有环境配置,在宿主机浏览器输入192.168.18.106就能访问虚拟机里面的网站了

May 22
第一 安装MySQL
这个我们要安装两个
sudo apt-get install mysql-server 提供MySQL服务
sudo apt-get install mysql-client   访问其它MySQL数据库

第二 安装Apache
sudo apt-get install apache2 libapache2-mod-auth-mysql

然后我们可以用 sudo /etc/init.d/apace2 restart 重启apache
然后在浏览器中输入http://localhost看看是否有
“It's Work”,有的话,就说明可以

第三 安装PHP
sudo apt-get install php5 libapache2-mod-php5 php5-cli php5-mysql php5-mcrypt php5-gd php5-mod

第四 配置 php
gedit /etc/php5/apache2/php.ini

在extension下面加上  
extension=php5-mcrypt.so
extension=php5-mysql.so

第五步 配置apache
a2enmod rewrite 开启rewrite功能
gedit /etc/apache2/apache2.conf
添加:
AddType application/x-httpd-php .php .html .htm .phtml

    DirectoryIndex index.htm index.html index.php


另:mysql配置文件 路径 /etc/mysql/my.cnf ,网站默认根目录:/var/www

May 13
9.模型
9.1实例化模型类

  //实例化空类
  $demo=new Model();
  //实例化基础类
  $demo=new Model('Demo');
  $demo=M('Demo');
       //实例化其他类,包括用户自定义类
  $demo=new DemoModel('Demo');
  $demo=D('Demo');
  //实例化项目Admin下的demo类
  $demo=D('Demo','Admin');


9.2模型命名
protected $tableName=""; 不带前后缀的表名
protected $trueTableName=""; 带前后缀的表名
protected $dbName=""; 数据库名

9.3创建数据
//会进行相关验证
$M->create($data);
//纯数据操作 无验证
$M->data($data);
$M->add();//保存数据

//模型测试
  public function dmt(){
    $d=M('Demo');
    //$i=$d->find(1);
    $i=array('title'=>'mytitke'.rand(0,19),'content'=>'mycontent'.rand(20,100));
    //直接保存数据 可连贯操作
    $d->data($i)->add();
    //通过create需要传入验证码  
    $i['__hash__']=$_SESSION['__hash__'];
    $d->Create($i);
    $d->add();
    //删除操作  
    $d->where('id between 10 and 20')->delete();
    //得到结果并输出
    $l=$d->where('id>1')->order('id desc')->limit('2,4')->select();
  }


9.4ActiveRecord模式
TP的AR模式就是 将表映射到model,将记录映射到对象~

//ActiveRecord模式
  public function tar(){
    $ar=D('Demo');
    //根据title 获取数据 保存在当前对象中
    $ar->getByTitle('hello title');
    echo $ar->id;   //7
    //根据content 获取数据 保存在当前对象中(其实是修改了当前对象)
    $ar->getByContent('mycontent93');
    echo $ar->id;   //5
    $ar->delete();   //  删除当前对象 即ID=5的数据
    $ar->delete('6,7'); // 删除ID=6,7的数据
  }


9.5 令牌验证 {__TOKEN__}
9.6 字段类型检查 DB_FIELDTYPE_CHECK
9.7 自动验证 protected $_validate
9.8 自动完成 protected $_auto
9.10
May 13
可能后面的工作要涉及到thinkphp了 那咱就来看看tp吧,下面是我看tp过程记录的点滴。

1.关于include/require文件内 return值
以前有遇到过,没在意。现在正是写入记忆里。
demo代码:

<?php
#require.php
return array('hello'=>'moto');
?>

#index.php
<?php
$d=require('require.php')
print_r($d)
?>
#打印结果#
Array ( [hello] => moto )


2.利用spl_autoload_register()重置自动加载函数
以前知道spl_autoload_register(func) 可以指定func来优先系统自带的_autoload()来执行类加载
今天看了tp里面的发现 spl_autoload_register()可以指定类的某个函数来进行类加载
真像如下:

#E:\www\thinkphp\ThinkPHP\Lib\Think\Core\App.class.php (61)
// 允许注册AUTOLOAD方法
        if(C('APP_AUTOLOAD_REG') && function_exists('spl_autoload_register'))
            spl_autoload_register(array('Think', 'autoload'));

#E:\www\thinkphp\ThinkPHP\Lib\Think\Core\Think.class.php (70)
  public static function autoload($classname)
    {
        // 检查是否存在别名定义
        if(alias_import($classname)) return ;
        // 自动加载当前项目的Actioon类和Model类
        if(substr($classname,-5)=="Model") {
            require_cache(LIB_PATH.'Model/'.$classname.'.class.php');
        }elseif(substr($classname,-6)=="Action"){
            require_cache(LIB_PATH.'Action/'.$classname.'.class.php');
        }else {
            // 根据自动加载路径设置进行尝试搜索
            if(C('APP_AUTOLOAD_PATH')) {
                $paths  =   explode(',',C('APP_AUTOLOAD_PATH'));
                foreach ($paths as $path){
                    if(import($path.$classname))
                        // 如果加载类成功则返回
                        return ;
                }
            }
        }
        return ;
    }



3.项目编译机制
系统第一次运行时自劢生成核心缓存文件~runtime.php和顷目编译缓存文件~app.php。

可以对项目编译机制进行自定义设置
自定义缓存文件路径:在入口文件里添加常量define('RUNTIME_PATH','./home/temp/');
自定义是否生成核心缓存:define('NO_CACHE_RUNTIME',True);
是否留白和注释:define('STRIP_RUNTIME_SPACE',false);

4.URL访问模式
普通URL格式http://localhost/home/index.php?m=modelN&a=actionN&var=value
PATHINFO格式  http://localhost/home/index.php/modelN/actionN/var/value
REWRITE格式 http://localhost/home/modelN/actionN
默认路径 http://localhost/home/index.php/index/index

5.TP的文件访问模式(默认的各种路由形式)
5.1模块的引入 APP名称/Lib/Action/具体文件
如:IndexAction.class.php Home/Lib/Action/IndexAction.class.php
5.2模板的引入 APP名称/Tpl/default/模块名称/具体动作名文件(.html)
如:IndexAction.class.php 中的help方法的模板路径为  Home/Tpl/default/index/help.html
【注:当IndexAction.class.php不存在help方法而模板却存在时,TP会直接渲染模板文件】
5.3类的导入 import(命名空间.路径.类名)
ThinkPHP约定是Think、ORG、Com包的导入以系统基类库为相对起始目录,否则就认为是项目应用类库为起始目录
如:import("Think.Util.Session") 将引入:ThinkPHP/Lib/Think/Util/Session.class.php文件
import("Home.myclass") 将引入:Home/Lib/myclass.class.php文件
以上也可以用另外一种简化方法:import("@.myclass");
用#代替类名中的. 如Home/Lib/myclass.inc.class.php 的导入方法为 import("Home.myclass#inc");
导入当前目录下的类文件myclass.inc.class.php方法: import("myclass#inc",dirname(__FILE__));
5.4 第三方类库导入 Vendor
第三方类库统一放在thinkPHP/Vendor/下
如要导入thinkPHP/Vendor/Zend/Auth.php方法:Vendor('Zend.Auth');

分页: 10/61 第一页 上页 5 6 7 8 9 10 11 12 13 14 下页 最后页 [ 显示模式: 摘要 | 列表 ]