招聘网

Post by agang 2010-8-28 15:14 Saturday

湖南招聘网
http://www.hunanhr.net/
湖南招聘网以面向社会、服务大众为宗旨,竭诚为广大企事业单位和求职人员提供一个展示企业招聘信息和求职信息的交流平台!

 

河南招聘网
http://www.henanhr.net/
河南招聘网以面向社会、服务大众为宗旨,竭诚为广大企事业单位和求职人员提供一个展示企业招聘信息和求职信息的交流平台!


湖北招聘网
http://www.hubeihr.net/
湖北招聘网以面向社会、服务大众为宗旨,竭诚为广大企事业单位和求职人员提供一个展示企业招聘信息和求职信息的交流平台!

 

深圳招聘网
http://www.hr0755.net/
深圳招聘网以面向社会、服务大众为宗旨,竭诚为广大企事业单位和求职人员提供一个展示企业招聘信息和求职信息的交流平台!

0

湖北招聘网服务简介

Post by agang 2010-8-16 22:36 Monday

湖北招聘网服务简介

http://www.hubeihr.net


个人可获得以下免费服务:
 
a、不限次数免费查询单位招聘职位;
b、不限次数免费与招聘单位进行留言联系;
c、自动加入我们的简历库,招聘单位可以与您联系;
d、免费使用收藏、职位查询等功能。
 
湖北招聘网企业服务

企业可获得以下免费服务:
 
a、不限次数免费查询单位招聘职位;
b、不限次数免费与招聘单位进行留言联系;
c、自动加入我们的简历库,招聘单位可以与您联系;
d、免费使用收藏、职位查询等功能。
 

0

湖南招聘网服务协议(个人)

Post by agang 2010-8-16 22:14 Monday

欢迎您成为湖南招聘网的个人会员,在您注册成为的我们的会员后,将享有我们提供的相应服务,但同时也要遵守相应的规则和履行一定的义务。请仔细阅读下列协议之各条款,您一旦注册成为我们的会员,则意味着你已完全接受以下条款。

一、湖南招聘网是一专业人才资源网站,网址为http://www.hunanhr.net 。主要为用人单位、求职人员提供各种人才和用人信息及相关服务。

二、个人会员拥有的权利:

  1)可在湖南招聘网中编辑、修改、储存、发送个人简历;

  2)可直接向感兴趣的岗位发送个人简历;

  3)可直接与感兴趣的公司联系;

  4)可直接得到应聘公司的答复。

三、个人会员要履行的义务:

  1)向湖南招聘网提供的注册资料,包括姓名、地址、联系方式等,必须是真实、有效、准确的。如果这些资料有任何改变,请及时予以更新。您对您输入的资料负全部的责任。一旦发现您发送虚假资料,我们保留在不发送任何通知的情况下删除您的资料并无限期停止对您的服务的权利。

  2)湖南招聘网仅限于企业招聘、个人求职以及其他人力资源的相关服务,因此您不应亦不得将湖南招聘网用于其它任何目的。

  3)您不得向湖南招聘网散发垃圾邮件、连锁邮件等骚扰性邮件;发布、传播或散发其它无关的信息。

  4)您不得擅自转让自己的用户名和口令给他人使用。因为通过您的用户名和口令编辑、发布的任何信息或做出的任何行为都将被视为是您自己的行为。

  5)未经湖南招聘网许可,不得将湖南招聘网的信息用于任何商业行为。

  6)您需要注意遵守国家法律规定,并特别注意以下业务:

   ·不得以任何手段非法篡改、破坏、删除(或有此企图)湖南招聘网或数据库中的内容,不得对湖南招聘网所属的服务器、系统或网络进行任何形式的攻击、破坏,不得制作、传播病毒。一经发现,我们将立即无限期终止对您的服务,并报告国家有关公安、行政、司法机关,追究您的法律责任。

   ·自愿接受湖南招聘网站法律声明的义务。 ·不得利用湖南招聘网来获取商业秘密,窥探个人隐私,侵犯他人知识产权,制造、传播和散布污蔑、诽谤、恐吓他人的言论和消息。一经发现,我们将立即无限期终止对您的服务,并报告国家有关公安、行政、司法机关,追究您的法律责任。

  7)对于因他人的违法或违约行为造成其它招聘单位或个人的损害,由侵权人直接承担法律责任,湖南招聘网站对此不负任何责任。

四、湖南招聘网可随时直接以电子邮件或其它方式与您联系,或向您发送信息。

五、您在每次修改自己的个人资料后,均须得到湖南招聘网的审核,湖南招聘网有权根据判断来决定资料的正确性,未经审核的资料将不予发布。

六、为使您能独立自由地行使您在湖南招聘网所享有的权利,我们不会随意复制、修改、删除、转移您在湖南招聘网的注册资料或储存在湖南招聘网的资料;也绝不会对任何第三方泄露您要求保密的注册资料。但基于下列事由的情形除外:

  1)法律的要求(例如:行政、司法机关的执法行为);

  2)您明确授权;

  3)为保护湖南招聘网的知识产权;

  4)在紧急和特殊情况下为保护公众利益;

  5)您违反本协议有关条款。

七、湖南招聘网的知识产权:

  湖南招聘网拥有网站计算机程序的一切版权。未经湖南招聘网书面许可,任何单位或个人不得以任何方式复制、转载湖南招聘网的任何内容,不得侵犯湖南招聘网的商业秘密或其他知识产权。

八、本协议的解释权归湖南招聘网所有。

按受以上协议  我不接受以上协议

网址:http://www.hunanhr.net

0

湖南招聘网法律申明

Post by agang 2010-8-16 22:13 Monday

湖南招聘网以面向社会、服务大众为宗旨,竭诚为广大企事业单位和求职人员提供一个展示企业招聘信息和求职信息的交流平台。

  本网的所有内容和图表受《中华人民共和国著作权法》及相关法律法规和中国加入的所有知识产权方面的国际条约的保护。湖南招聘网对网站内容享有完整的著作权,未经其允许,不得以任何形式复制和采用。在内容和图表不作任何修改、保留性内容未做修改以及得到湖南招聘网的许可的情况下,湖南招聘网的网上材料可作为网外信息方面其他非商业性的用途。

  请勿擅自复制或采用湖南招聘网所创造的用以制成网页的HTML。湖南招聘网对其html享有著作权。同时湖南招聘网对其网址上的所有图标、图饰、图表、色彩、文字表述及其组合、版面设计、数据库均享有完全的著作权,对发布的信息均享有专有的发布和使用权,未经湖南招聘网同意,不得擅自复制、使用或转载。
 
  湖南招聘网并无随时监视此网址,但保留对其实施实时监视的权利。对于他方输入的,不是湖南招聘网发布的材料,湖南招聘网概不负任何法律责任。应聘信息发布方必须对其存入简历中心的个人简历及材料的格式、内容的准确性和合法性独立承担一切法律责任。招聘信息的发布方对其在职位数据库公布的材料独立承担一切法律责任。 湖南招聘网不保证对某一种职位描述会有一定数目的使用者来浏览,也不保证会有一位特定的使用者来浏览。对于其他网址链接在本网址的内容,湖南招聘网概不负法律责任。

  湖南招聘网只能用于合法目的,即个人寻找职业和雇主寻找雇员。湖南招聘网明确禁止任何其他用途,所有使用者必须保证不用于下列任何一种用途:
(1). 在简历中公布虚假的、不完整的或不准确的简历资料(包括以为他人寻找全职或兼职工作之目的发布的简历),公布不是简历的资料,如意见、通知、商业广告或其他内容。
(2). 本公司的竞争同行用此方法寻求与雇主的业务联络。
(3). 擅自删除或修改任何其他个人或公司公布的资料。
(4). 擅自打印、复制或使用有关求职者的任何个人资料或有关雇主的商业信息。
  禁止使用者破坏或企图破坏湖南招聘网的安全规则,其中包括但不限于:
(1). 接触未经许可的数据或进入未经许可的服务器或帐户;
(2). 没有得到许可,企图探查,扫描或测试系统或网络的弱点,或者破坏安全措施;
(3). 企图干涉对用户及网络的服务,包括并不限于:通过超载、”邮件炸弹”或”摧毁”等手段;
(4). 发送促销,产品广告及服务的E-mail;
(5). 伪造TCP/IP数据包名称或部分名称。破坏系统或网络可能导致犯罪,湖南招聘网将调查、干预此类破坏行为的发生,并将与执法当局合作,起诉此类破坏行为的使用者。
  严禁出现下列三种情况:
(1). 违反任何现行法律法规;
(2). 侵犯他人的著作权及其他知识产权,侵害他人的商业机密或侵犯他人的隐私权等其他个人权利;
(3). 利用本网址传送、分发、储存属于诽谤、淫秽、威胁、辱骂性的材料,毁损他人材料。
  任何经湖南招聘网确认已违反了网站使用规则的用户,将收到一份书面警告。在该用户同意以书面形式表示不再有任何犯规行为时,湖南招聘网有权决定是否给予其暂停使用的处理。但是,湖南招聘网可以不提出警告而马上暂停或终止对该用户的服务,如果湖南招聘网认为确有其必要,对屡犯者将立即作出暂停使用或终止使用的处理。
  除了本网址在以上条目中提出的条款外,经使用者理解并同意后,湖南招聘网在不公开姓名的情况下,可以为用户应聘或招聘的目的向第三方提供综合性的资料。除非司法行政等公务需要,在未经本人同意的情况下,湖南招聘网将不向任何第三方公开用户相关资料。
  在网上登记、使用的用户使用本网址将承担一定风险: 湖南招聘网不能保证在网上登记的用户材料的特殊目的不受阻挠或不出错误、不能保证错误一定能得到纠正,也不能保证本网址或制成本网址的材料不会含有病毒或其他有害成分。在涉及有关材料的使用或使用结果方面,湖南招聘网对在网上登记的用户材料的正确性、准确性、可靠性及其他同时不作出任何保证或说明。用户(而不是湖南招聘网)将承担因此而造成的一切必要的服务、修补和改正费用,除非现行的法律法规另有明文规定。
  湖南招聘网保留随时修正本服务条款的权利。
  
    警告:使用湖南招聘网网络时违反本条款将构成对湖南招聘网权利的侵害,湖南招聘网将保留采取一切法律措施的权利。

网址:http://www.hunanhr.net

0

解决DIV给flash挡住的问题

Post by agang 2010-8-16 17:05 Monday

<param name="wmode" value="opaque">
这个用于解决DIV给flash挡住的问题

<!--以下是源码-->

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0 " width="468" height="60"><param name="movie" value="http://www.webjx.com/up/cxchina_ad.swf ">
 <param name="wmode" value="opaque"><param name="quality" value="high"><embed src="http://www.webjx.com/up/cxchina_ad.swf " quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer " type="application/x-shockwave-flash" width="468" height="60"></embed></object>
 <div style="position:absolute;left:150;top:50;width:100px;height:50px;background:green">
 </div>
<!--END-->

0

PHP类的精缩归纳(2010年最新)

Post by agang 2010-8-16 16:56 Monday

一:结构和调用(实例化):

class className{} ,调用:$obj = new className();当类有构造函数时,还应传入参数。如$obj = new className($v,$v2...);

二:构造函数和析构函数:
1、构造函数用于初始化:使用__construct(),可带参数。
2、但析构函数不能带参数(用于在销去一个类之前执行一些操作或功能)。析构函数用__destruct()做名称。在脚本执行结束时,PHP会销掉内存中的对象,因此可不用析造函数,但有些比如COOKIE等,就应当要用此函数销掉。
知识点:在PHP4中也提供了构造函数,但使用的是与类同名的类方法,在PHP5仍能兼容这种做法,当一个类中没有包含__construct时,会查找与类同名的方法,如果找到,就认为是构造函数,如下:


class test
{ var $b;
function test() {   $this->b=5; }
function addab($c) {   return $this->b+$c; }
}
$a = new test();   echo $a->addab(4); // 返回 9
3、PHP不会自动调用父类的构造函数(不支持构造函数重载),必须使用parent关键字显式地调用。
class employee{
      function __construct()....
}
class Manager extents Employee{
     function __construct(){
          parent::_construct();
          echo '这个子类的父类构造函数调用了!';
     }
}
当然也可以调用与该实例没有任何关系的其它类的构造函数。只需在__construct()前加上类名即可。如:
otherClassName::__construct();

类的主家庭成员:属性、方法、常量、静态成员

三、类的属性:
有两种方法对类的属性赋值或取值。
1、使用公共作用域public关键词。
2、使用__set()和__get()来分别赋值和取值,前者称为设置方法(setter)或修改方法(mutator),后者称为访问方法(accessor)或获取方法(getter)。建议使用这种方法:优点:
A、可在__set()统一进行数据验证。
B、便于统一管理属性。
注意:
第一:__set()和__get()只对私有属性起作用,对于用public定义的属性,它们两个都懒理搭理,如下:
class test{
protected $a=9,$b=2,$c;
   public $d;
    function __set($n,$v) {    $this->$n = $v+2; }
    function __get($name) { return $this->$name+2; }
}
$a = new test();
$a->b =5; echo "<br />";   echo $a->b;
实例只对$a,$b,$c的设置会经过__set和__get过滤与返回,对于$d,就不会起作用。如$a->d=5,再返回还是5。
第二:__set($n,$v)要带两个参数。而__get($n)只能有一个参数。实例:
class test{
      private $a=5,$b=6,$c;
      function __set($n,$v)
     {
        if($n=='a'&&$n>0)
               $this->$n = $v;
         else
               $this->$n = $v+2;   
     }
      function __get($name)
      {
            return $this->$name; //如果改为return $this->$name + $this->addab();   如调用a的值,实际返回的是a+a+b的值。默认为5+5+6=16。
      }
      function addab()
       {         return $this->a + $this->b;   }
}
$e=new test();
$e->a = 11;   //注意写法:类的内部用$this->$n即变量的写法,但外部实例要用$e->a的方式。
$e->b = 12;   //get 14
$e->k = 22;

类的属性可自由扩展,如上例的k,不管是否用__set,当一个实例建立起来后,可以用$e->newProperty = xx;直接来创造一个属性,但不建议这么做。

四、类的方法:
理解成类当中的函数即可。
调用:
1、内部调用:可使用$this->Fanname();或$this->addab()或test::addab();
2、实例化调用时,用$e->addab();即可。对于在该方法中没有使用$this关键字的,如上例中的:
function addab() {    return $this->a+$this->b;    }
改为: function addab() {    return 25;    }那在在外部实例调用该方法,也可用“$e::addab();”或“test::addab();”

五、类的常量:
如果类的属性理解成类中的变量,那么类的常量和变量是不一样的,其定义方法为:
class test{
      private $a;
      const PI = '3.14';
      .....
      //在类中调用上面的常量用两种方法,“$this::PI”,或 “类名::PI”,这里就是test::PI,如下:
      function getvalue(){
            return $this->a * $this::PI; //或$this->a * test::PI,用this关键字或类名均可,但都要用双冒号。
     }
}
$e= new test();
$e->PI =5;   //注意,这里用 ->只是创造了一个也是名为PI的属性,而不是改变类中的PI常量的值。
echo $e::PI; //这个才是调用类的常量。
常量只能用双冒号::来调用。并且不能更改其值。
在类外部实例化后调用类常量同样也有两种方法。方法为:
“$e::PI”   或 “test::PI”,共同点是都要用冒号,不同点是外部不能用this关键字,只能用实例名,但类名::PI是通用的。

六、类的静态成员(静态属性或静态方法):
如果需要创建供所有类的实例共享的字段或方法。就得用静态成员。有两个特征:
1、静态成员是gong产zhu义者,它让脚本上的所有该类的实例调用,但不能借助类的特定实例名调用,而是在类的外部,统一使用“类名::$成员名”的方式调用。而类的内部则统一使用 “self::$成员名”来调用。
2、当每一次新创建实例时,静态成员会从上次创建的实例最后值开始重新计算,而不是类中初始的值开始计算。
3、对于用public定义的静态成员,可以在外部更改它的值。private等则不行。
class test{
       public static $v = 0;
    function __construct(){  self::$v++; }
    static function getV(){   return self::$v; }
}
$a = new test();
echo test::getV(); // 返回 1
$b = new test();
echo test::getV();   // 返回 2
test::$v=8;   //由于public定义的成员,改变静态成员的值。
$c = new test();
echo test::getV();   // 返回 9

七、关键字:
(一)this关键字:用于类的内部指代类的本身。来访问属性或方法或常量,如$this->属性名或方法名。$this::常量名。this还可以用在该类的子类中,来指代本身的属性或方法。
(二)双冒号“::”关键字:用于调用常量、静态成员。
(三)self关键字:在类的内部与双冒号配合调用静态成员,如 self::$staticVar.,在类的内部,不能用$this来调用静态成员。
(四)__toString():在类中使用__toString(),用于将类转成字串并打印类,用处不大:如:
class test{     public $p;
   public function __toString(){   return var_export($this,TRUE);   }
}
$a=new test();
echo $a; //输出:test::__set_state(array( 'p' => NULL, )),或写成:echo $a->__toString();
(五)__clone() :当克隆对象时,这个关键字才会发生作用,用于更改克隆时某些值。
(六)__call():方法重载,参下面示例:
class cB{
function __call($method,$n){
    if($method=='showVarType'){
        if(is_numeric($n[0])){   //不能用$n。要用$n[0];
                $this->displayNum();
           }else if (is_array($n[0])){
                $this->displayArr();
         }else{
                $this->displayOther();
        }
   }
}
function displayNum() {
        echo '<h3>这是数字!</h3>';
}
function displayArr() {
      echo '<h3>这是数组!</h3>';
}
function displayOther() {
      echo '<h3>不是数组也不是数字!</h3>';
}
}

$x='a';
$y=array('a','b');
$b=new cB;
$b->showVarType($x); //不是数组也不是数字
$b->showVarType($y); //这是数组
注意,不能在类中定义showVarType()方法,否则代码不能用。
(七)extends:继承: 如class a{}     class b extends a{} 类b继承了类a
附:记忆:以后统一在调用方法或属性时用 "-> ",调用常量则用双冒号“::”,不会搞晕。

八、方法和属性的作用域:
共有6种:public(默认,可省略,也等同于php6的var声明),private(私有,也不能由子类使用),protected(私有,但可由子类使用) ,abstract(抽象,参下文),final(阻止在子类中覆盖—也称重载,阻止被继承,用于修饰类名及方法,如final class test{ final function fun(){}} ,但不能用于属性),static(静态)

九:抽象类和抽象方法(abstract——注意:没有所谓抽象属性):
抽象可以理解成父类为子类定义了一个模板或基类。作用域abstract只在父类中声明,但在子类中实现。注意事项:
1、抽象类不能被实例化,只能被子类(具体类)继承后实现。
2、抽象类必须在其子类中实现该抽象类的所有抽象方法。否则会出错。
3、在抽象方法中,只是声明,但不能具体实现:如abstract function gettow(){ return $this->p; }是错的,只能声明这个方法:abstract function gettow();(连方括号{}都不要出现),抽象方法和抽象类主要用于复杂的类层次关系中。该层次关系需要确保每一个子类都包含并重载了某些特定的方法。这也可以通过接口实现
4、属性不能被命名为抽象属性,如abstract $p = 5是错的。
5、只有声明为抽象的类可以声明抽象方法,但如果方法声明为抽象,就不能具体实现。如:
abstract class Employee
{
    abstract function a(...);
    abstract function b(...);
}
以后再对这个父类扩展,组成各种子类(如经理,员工,出纳)。
6、抽象类中,如果要实现具体的方法,不能声明为抽象。这样可能实际意义更大。可以把几个类库中共同的部分提取到抽象类中,其它的类继承抽象类即可。如下:
abstract class BaseShop{
     Const TAX=0.06;    // 在抽象类中定义常量
    public function buy($gid) {     // 如果定义为抽象方法abstract function buy()就不能在这里实现主体。
         echo('你购买了ID为 :'.$gid.'的商品');
   }
      public function sell($gid) {
      echo('你卖了ID为 :'.$gid.'的商品');
      }
     public function view($gid) {
       echo('你查看了ID为 :'.$gid.'的商品');
     }
}
class BallShop extends BaseShop{
     var $itme_id = null;
     public function __construct()
    {
          $this->itme_id = 2314;
     }
     public function open()
      {
         $this->sell($this->itme_id);
     }
      public function getTax()
     {
              echo printf('<h3>平均税率是 %d%%。</h3>',$this::TAX*100);
      }
}
$s = new BallShop;
$s->open(); //你卖了ID为 :2314的商品
$shop->getTax();

十:类型提示:
注意,类型提示功能只能用于参数为对象的提示,而无法用于为整数,字串,浮点等类型提示。有些类的方法需要传入的参数为所期望的对象类型,可以用下面的方法达到强制实施此替则。要达到类型提示,只要在方法的对象型参数前加一个已存在的类的名称,如:function funname(OtherClassName $otherclassINSName,$c....),注意,OtherClassName必须是存在的类。如下:
class em{   var $k=56; }
class test{
function __construct()
{   echo $this->addab(new em(),2);   }

function addab(em $j,$c)   //这个方法,即可以在内部调用,也可以在外部调用。只要作用域许可。
{    return $j->k+$c; }
}
$a = new test();
$b = new em();
echo $a->addab($b,2); //或 $a->addab(new em(),2);

十一、类的管理:
1、instanceof关键字:用于分析一个对象是否是某一个类的实例或子类或是实现了某个特定的接口:如下例,但要注意: 类名没有任何引号等定界符,否则会出错。如test不能用'test'
class test2{}
class test{}
class testChilern Extends test{}
$a = new test2();
$m = new test();
$i = ($m instanceof test);
if($i)echo '$m是类test的实例!<br />'; // get this value
switch ($a instanceof test){
   case true :
           echo 'YES<br />';
            break;
    case false :
            echo 'No<br />';   //get this value
    break;
}
$d=new testChilern();
if($d instanceof test)echo '$d是类test的子类!<br />'; // get this value
2、确定类是否存在:boolean class_exists(string class_name): class_exists('test');
3、返回类名:string get_class(object),成功时返回实例的类名,失败则返回FALSE:
$a = new test2(); echo get_class($a);   //返回 test2
4、了解类的公用属性:array get_class_vars('className') ,返回关键数组:包含所有定义的public属性名及其相应的值。这个函数不能用实例名做变量
5、返回类方法:get_class_methods('test'); //或: get_class_methods($a);可用实例名做参数,返回包括构造函数在内的所有非私有方法。
6、print_r(get_declared_classes())了解当前PHP版本中所有的类名。PHP5有149个。
7、get_object_vars($a)返回实例中所有公用的属性及其值的关联数组。注意它和get_class_vars()的区别:
/* (1) get_object_vars($a)是用实例名做参数,而get_class_vars('test')是用类名做参数。
* (2) get_object_vars($a)获得的属性值是实例运行后的值,而get_class_vars('test')获得的属性值是类中的初始定义。
* (3) 两者均返回关联数组,且均对未赋值的属性返回NULL的值。如类test中有定义了public $q;则返回Array ( [v] => 5 [q]=>) ,
*/
8、返回父类的名称:get_parent_class($b);//或get_parent_class('test2'); 返回test
9、确定接口是否存在:boolean interface_exists($string interface[,boolean autoload])
10、确定对象类型: boolean is_a($obj,'className'),当$obj属于CLASSNAME类时,或属于其子类时,返回TRUE,如果$obj与class类型无关则返回FALSE。如:is_a($a,'test')
11、确定是否是某类的子对象:当$b是继承自TEST类时,返回TRUE,否则FALSE。boolean is_subclass_of($b,'test');
12、确定类或实例中,是否存在某方法。method_exists($a,'getv') //或用method_exists('test','getv'),此函数适用于非public定义的作用域的方法。
以上函数实例:
class test{
public $v=2;
private $c=5;
function __construct(){
   $this->v=5;
}
private function getv(){
   return $this->v;
}
}
class test2 extends test{}

$a=new test();
$b=new test2();
print_r( get_class_methods('test')); //或:print_r( get_class_methods($a)); 均返回:Array ( [0] => __construct [1] => getv )
echo '<br />';
print_r( get_class_vars('test')); //返回:Array ( [v] => 2 ),和上面不一样,不能用print_r( get_class_methods($a));
echo '<br />';
echo get_parent_class($b);//或get_parent_class('test2'); 返回test
echo '<br />';
echo is_a($b,'test');// 返回1
echo '<br />';
if(is_subclass_of('test2','test'))echo '是子类!'; //或(is_subclass_of($b,'test')),返回1,当参数1为$a时则返回false,
echo '<br />';
echo method_exists($a,'getv') //或用method_exists('test','getv')返回1,本函数也适用于用private等定义域的方法。

十一、自动加载类库文件:
当类多了以后,比如要在一个文件中载入3个类库文件:a.class.php,b.class.php,c.class.php要用三个require_once('classes/a.class.php);
require_once('classes/b.class.php);
require_once('classes/c.class.php);
可以用PHP5自动加载的功能来处理:在全局应用配置文件中,定义一个特殊的函数__autoload($class)函数(__autoload并不是一个类的方法,只是单独的函数,和类没有关系):
function __autoload($class){
     require_once("classes/$class)
}
该函数放哪没有关系,在创建类实例时,也不必去调用这个autoload函数。PHP会自动完成。但务必注意一点:“在调用页面上创建实例所使用的类名称”、和“被调用的文件名”、以及“该文件中的类的名称”3个必须是一样的。这样就不需要去调用__autoload();如果不一样则必须单独调用__autoload('c');并给它一个文件名前缀。如:
c.class.php文件的代码是:
<?php
class c{
public $m=7;
}
?>这里代码的类名称是c,而文件名也是c,
现在要在index.php调用:
<?php
function __autoload($class){
require_once "$class.class.php";
}

$m = new c(); //创建实例调用的类也是c
echo $m->m;
?>
此时PHP会自动调用根目录下的c.class.php中的类C。

但如果c.class.php中的代码是:
<?php
class mm{
public $m=7;
}
?>
而调用页index.php代码是:
<?php
function __autoload($class){
require_once "$class.class.php";
}
# __autoload('c'); //如果不加这一行就会出错。
$m = new mm();
echo $m->m;
?>
会出错,提示找不到mm.class.php文件。这时可以加一行__autoload('c');但这样就达不到简化代码的目的。

类的家族化扩展:类的高级功能:

一、对象克隆:
当克隆一个对象的实例时,其属性初始值继承了被克隆对象的当前值。
class test
{
public $p=5;
function __clone(){    //只在克隆发生时起作用。用于改变在克隆时某些值
         $this->p=15; 
   }
}
$a=new test();
echo $a->p;
$a->p=8; //如果没有__clone()方法影响,$b的P值将为8
$b = clone $a;
echo $b->p; //15

二、对象继承:

没有被声明为final的类可以被继承,没有被final和private界定的方法也可以继承,没有被private界定的属性也可以继承。当子类继承了父类或超类后,可以直接使用父类或超类(祖父类以及祖父的祖父)的所有允许的方法,属性。
关键:理解构造函数和重载在继承中的特性!
(一)构造函数在继承中的特性:
1、当父类有构造函数而子类没有:则子类会在实例化时会自动执行父类的构造函数。这时如果要创建子类的实例,需要引入父类构造函数中所需的参数,否则出错。即使是“子类的子类”如果没有构造函数,也要在创建实例时输入其父类的父类的构造函数所需参数。PHP会从实例所在的子类会向上搜索合造的构造函数,一旦找到就停止,使用该构造函数。而不会再向上搜索,因此:子类本身如果没有构造函数,则以其最靠近的一个超类并且有构造函数的为准。
class cA{
public $name,$age;
   function __construct($n) {
         $this->name = $n;
       $this->age = 25;
}
function __set($n,$v) {
           $this->$n = $v;
   }
function __get($n) {
      return $this->$n;
   }
}

class cB extends cA{
   function funB1()   {          echo '<h3>Class cB execute success!</h3>';   }
}

class cC extends cB {
function funC1() {     echo '<h3>Class cC FunC1!</h3>'; }
}
$b=new cB('Jack');
$b->name='John';
echo "$b->name : $b->age";
$b->funB1();
$c=new cC(); //这里会出错,由于cB也没有构造函数,因此再向上以cA为准,需要一个参数。改为$c=new cC('David');即可。
echo $c->name(); //David
2、当子类也有构造函数时:这时,不管父类是否有构造函数,都会执行子类自己的构造函数。
如上:
class cB extends cA{
function __construct() {
   echo '<h3>this is Class cB 's __construct!</h3>';
}
function funB1() {
   echo '<h3>Class cB execute success!</h3>';
}
}
现在类CB有自己的构造函数时,这时创建实例$b=new cB('Jack');参数JACK不会起作用,因为父类CA的构造函数没有得到执行。因此$b->name和$->age就不会初始化值。需要另外赋值$b->name='Jack',$b->age=25;
如果这时要执行父类CA的构造函数,可以这样:
function __construct($n) {
      parent::__construct($n);   // 或:cA::__construct($n);
      echo '<h3>this is Class cB 's __construct!</h3>';
}
由于parent::__construct($n); 只会向上搜索父类的构造函数,一找到就停止且执行当前找到的构造函数,因此在上面例子中,如果parent::__construct($n)是用在最后一层的类cC中,并且类CB,CA都有构造函数,那么cC的实例只会执行cB的构造函数。不会执行cA。这时,如果CC的实例想都调用CA和CB的构造函数,有两种方法:
A、在CB中也加入parent::__construct($n)
B、在CC中把构造函数改为:
function __construct($n) {
      cA::__construct($n);   //即:类名::构造函数。
     cB::__construct();
echo '<h3>this is Class cB 's __construct!</h3>';
}
(二)在子类中调用父类的属性或方法:
1、调用父类方法:在子类中调用父类的方法,有3种方法:
     $this->ParentFunction(); 或
   父类名::ParentFunction();    或
     parent::parentFun();
2、调用父类属性:只能用$this->ParentProperty;
(三)重载:
在子类中,可以定义与父类相同属性或方法,改变父类该属性或方法的值或操作,称做重载。如:
calss ParClass{ function pfun(){ ....}}
class ChildrenClass extends ParClass{function pfun(){ ....}}} //重载了父类的pfun的方法。
在子类中重载后,优先执行自己重载后的新定义的方法或属性。
也可以在子类中用parent::parentFun();调用父类的方法,但所得到的值是子类自己输入的参数运算值。而不是该方法在父类中运算的值。

三、接口:

接口:interface,可以理解成一组功能的共同规范,最大意义可能就是在多人协作时,为各自的开发规定一个共同的方法名称。
和抽象类中的抽象方法一样:
1、不能在接口中对方法具体实现进行定义。而是由具体类来实现(而抽象类中的非抽象方法可以不必再定义,只有抽象方法和接口是一样要求要在具体类中实现)。
2、和抽象类一样,可以在接口中定义常量,并由具体类直接继承。
3、具体类必须实现抽象类的所有抽象方法(非抽象方法除外),同样,具体类如通过implements实现了接口后,必须完成接口中的所有方法。

接口实现过程:1、定义接口,2、用..implement X,Y,...和具体类对接。
interface Info{    //定义接口
     const N=22;
     public function getage();
     public function getname();
}

class age implements Info //如要多个接口 class age (extends emJob) implements Info,interB...
{
    public $age=15;
     public $name='Join';
     function getage() {
          echo "年级是$this->age";
     }
      function getname() {
             echo "姓名是$this->name";
      }
      function getN(){
             echo '<h3>在接口中定义的常量N的值是:'.$this::N.' </h3>'; //直接继承接口中的常量值。
     }
}

$age=new age;
echo $age::N; //22,直接调用接口中的常量值。
$age->getN();
关于抽象类和接口类的使用区分:何时用接口,何时用抽象?
1、相关性:当创建的模型由一些紧密相关的对象采用时,用抽象。对于不相关对象采用的功能,用接口。
2、多重继承:PHP类可以继承多个接口,但不能扩展多个抽象类。
3、公共行为实现:抽象类可在其中实现公共的方法,但接口不行。

四、命名空间(PHP6)

类库脚本A.inc.php和脚本B.inc.php中都一个类的名称为 class CNAME,并且这两个文件要在同一个文件如index.php中被调用。这时要用到命名空间。
步聚:
1、打开上面的A和B两个文件,分别在上面的最前面各加一行:
namespace SPACEA;   和 namespace SPACEB;   名字自定。
2、在index.php中实例化类时,在类的前面添加命名空间和双冒号做为前缀:
include 'a.inc.php';
include 'b.inc.php';
$a=new SPACEA::CNAME();
$b=new SPACEB::CNAME();
这样就不会冲突了。
但在PHP6正式发布前,这个功能还未定下来。

五、实现迭代器和迭代。
参《PHP圣经》P142;

六、使用Reflection(反射)API 。
简易实例:
class a{ .... }
$c = new ReflectionClass('a'); //PHP 内置类。
echo '<pre>'.$c.'</pre>';
输出类a的结构和内容。

0

PHP字符编码与特殊字符过滤

Post by agang 2010-8-16 10:59 Monday

1、强制加入反斜线

 

由于有些主机默认开启魔术引用get_magic_quotes_gpc,有些可能关闭,所以在程序上最好一律强制加入反斜线,这样可以统一处理,字符涉及单引号、双引号和反斜线。

PHP代码
   
function fnAddSlashes($data)      
{      
    if(!get_magic_quotes_gpc()) //只对POST/GET/cookie过来的数据增加转义      
        return is_array($data)?array_map('addslashes',$data):addslashes($data);      
    else     
        return $data;      

 

 
 

2、对特殊字符处理
以下是几个常用字符串处理,可以视具体情况取舍。由于上面已经对提交表单数据进行一次转义,所以如果需要对内容替换或过滤需要考虑addslashes对相关字符的影响,替换或查找时需考虑反斜杠的添加。其它字符替换不影响,比如\r\n替换。

A、多个连续空格只保留一个

PHP代码
   
$data = preg_replace("/\s(?=\s)/","\\1",$data );//多个连续空格只保留一个

 

B、回车换行替换成
 

PHP代码
   
$data = str_replace("\r","<BR>",$data );      
$data = str_replace("\n","<BR>",$data );      
//html中默认<BR>没封堵,xhtml中<BR>有封堵,建议使用<BR>

 

 
 

C、多个连续
只保留一个

PHP代码
   
$data = preg_replace("/((<BR\ ?>)+)/i", "<BR>", $data );//多个连续<BR>标签只保留一个 

 

 

 

D、全部过滤HTML标记
该方式是全部过滤潜在危险的标记,包括HTML、链接、未封堵HTML标记、JS、PHP。

使用函数strip_tags($data)

该函数使用后会过滤全部的HTML标记(包括链接)和PHP标记、JS代码等,其中链接会保留链接原文只是去除<a>标记和href部分内容,PHP标记和JS标记则会整体去除,包括中间的内容

E、不过滤标记,只是把他们HTML化

该方法是把原提交内容全部按照普通文本来处理。

使用函数htmlspecialchars($data),该函数执行后会把提交数据全部按照普通文本来展示

使用htmlentities函数执行结果(中文显示乱码)

 

三、写入数据库
由于使用addslashes($data)后对于高级的可信任用户可以直接写入数据库,但是addslashes无法拦截使用0xbf27代替的单引号,所以最好还是使用mysql_real_escape_string或mysql_escape_string进行转义,不过转义之前需先去除反斜杠(假设已默认开启addslashes)。

PHP代码
   
function fnEscapeStr($data){      
    if (get_magic_quotes_gpc()){      
        $data= stripslashes($value);      
    }      
    $data="'". mysql_escape_string($value) ."'";      
    return $data;      
}      
$data=fnEscapeStr($data); 

 
四、提交后的即时显示
1、如果上文使用了addslashes,则必须在把数据回显之前去除反斜线

使用函数stripslashes($data)

注意这个函数只是面向被addslashes($data)处理后的数据,要谨慎使用,否则会导致反斜线丢失(比如内容的文件夹路径分割线、驱动器路径等)。

2、使用函数htmlspecialchars($data),该函数执行后会把提交数据全部按照文本来展示,除非允许链接等需特殊处理外,可以一律使用 htmlspecialchars输出,尤其是对于未封堵的HTML标记,如果既没有过滤再不采用标记转换,那么输出后可能会导致版面混乱。

htmlentities则不建议使用,一方面对输出的源码造成很大的阅读障碍,再者使用htmlentities函数会造成双字节字符比如中文会显示一堆乱码。其它字符显示还算正常。

第二种输出方法,视情况需要,如果确认没有非法标记或潜在的执行风险,可以直接输出。

htmlentities和htmlspecialchars这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符串。防止字符标记被浏览器执行。转换英文时二者不会出现问题,当转换中文时htmlentities()必须加上编码,否则就会出现乱码。

 
PHP代码
   
echo htmlentities($str, ‘utf-8′);//或者是gb2312,注意:不支持GBK      
echo htmlentities($str, ENT_QUOTES, ‘utf-8′);      
     
echo htmlspecialchars($str, ‘utf-8′);      
echo htmlspecialchars($str, ENT_QUOTES, ‘utf-8′); 

 

区别:htmlentities转换所有的html标记,而htmlspecialchars只转换&、”、’、<、>这5个标记

PS:有些GBK编码的内容,要在后面加个空格才不会显示正常,否则就出现乱码,不解。 还是UTF-8一统江湖的好。
 

0

几个与特殊字符处理有关的PHP函数

Post by agang 2010-8-16 10:47 Monday

 

函数名 释义 介绍
htmlspecialchars 将与、单双引号、大于和小于号化成HTML格式 &转成&amp;

"转成&quot;

'转成&#039;

<转成&lt;

>转成&gt;
htmlentities() 所有字符都转成HTML格式 除上面htmlspecialchars字符外,还包括双字节字符显示成编码等。
addslashes 单双引号、反斜线及NULL加上反斜线转义 被改的字符包括单引号 (')、双引号 (")、反斜线 backslash (\) 以及空字符NULL。
stripslashes 去掉反斜线字符 去掉字符串中的反斜线字符。若是连续二个反斜线,则去掉一个,留下一个。若只有一个反斜线,就直接去掉。
quotemeta 加入引用符号 将字符串中含有 . \\ + * ? [ ^ ] ( $ ) 等字符的前面加入反斜线 "\" 符号。
nl2br() 将换行字符转成<br>
strip_tags 去掉HTML及PHP标记 去掉字符串中任何
HTML标记和PHP标记,包括标记封堵之间的内容。注意如果字符串HTML及PHP标签存在错误,也会返回错误。
mysql_real_escape_string 转义SQL字符串中的特殊字符 转义 \x00 \n
\r 空格 \
' "
\x1a,针对多字节字符处理很有效。mysql_real_escape_string会判断字符集,mysql_escape_string则不用考虑。

0

PHP二分查找法应用之IP查找

Post by agang 2010-8-16 10:37 Monday

PHP二分查找法应用之IP查找

前段时间做数据分析,需要大量的IP地址查询(每秒钟近万次检索),首先考虑到使用数据库。数据库大概存储几十万条IP记录,记录集如下:

+----------+----------+------------+---------+---------+--------+--------+
| ip_begin | ip_end | country_id | prov_id | city_id | isp_id | netbar |
+----------+----------+------------+---------+---------+--------+--------+
| 0| 16777215 | 2 | 0 | 0 | 0 | 0 |
| 16777216 | 33554431 | 2 | 0 | 0 | 0 | 0 |
| 33554432 | 50331647 | 2 | 0 | 0 | 0 | 0 |
| 50331648 | 67108863 | 3 | 0 | 0 | 0 | 0 |
| 67108864 | 67829759 | 3 | 0 | 0 | 0 | 0 |
+----------+----------+------------+---------+---------+--------+--------+  
 这样做查询需要用到如下SQL:

 

$sql = 'SELECT * FROM i_m_ip WHERE ip_begin <= $client_ip AND ip_end >= $client_ip';
 


这样的检索显然用不到索引,即使用到,MySQL查询效率也不大可能达到每秒500次以上。
  从上表可以看到IP库是从0到4294967295的一个连续数值,这个数值要是拆开存储,会有几百G的数据,所以没办法使用索引也没办法哈希。最终我使用PHP将这些东东转为二进制存储,抛弃了数据库的检索。可以看到IP起止长度为一个4字节的长整型,后面的国家ID、省份ID等,可以使用2个字节的短整型来存储,总共一行数据就有18个字节,总共31万条数据,算起来也就5M的样子。具体IP库生成代码如下:

 

/*
IP文件格式:
3741319168 3758096383 182 0 0 0 0
3758096384 3774873599 3 0 0 0 0
3774873600 4026531839 182 0 0 0 0
4026531840 4278190079 182 0 0 0 0
4294967040 4294967295 312 0 0 0 0
*/
set_time_limit(0);
$handle = fopen('./ip.txt', 'rb');
$fp = fopen("./ip.dat", 'ab');
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle);
$buffer = trim($buffer);
$buffer = explode("\t", $buffer);
foreach ($buffer as $key => $value) {
$buffer[$key] = (float) trim($value);
}
$str = pack('L', $buffer[0]);
$str .= pack('L', $buffer[1]);
$str .= pack('S', $buffer[2]);
$str .= pack('S', $buffer[3]);
$str .= pack('S', $buffer[4]);
$str .= pack('S', $buffer[5]);
$str .= pack('S', $buffer[6]);
fwrite($fp, $str);
}
}

 

这样IP就按照顺序每18字节一个单位排列了,所以很容易就使用二分法来检索出IP信息:


function getip($ip, $fp) {
fseek($fp, 0);
$begin = 0;
$end = filesize('./ip.dat');
$begin_ip = implode('', unpack('L', fread($fp, 4)));
fseek($fp, $end - 14);
$end_ip = implode('', unpack('L', fread($fp, 4)));
$begin_ip = sprintf('%u', $begin_ip);
$end_ip = sprintf('%u', $end_ip);

do {
if ($end - $begin <= 18) {
fseek($fp, $begin + 8);
$info = array();
$info[0] = implode('', unpack('S', fread($fp, 2)));
$info[1] = implode('', unpack('S', fread($fp, 2)));
$info[2] = implode('', unpack('S', fread($fp, 2)));
$info[3] = implode('', unpack('S', fread($fp, 2)));
$info[4] = implode('', unpack('S', fread($fp, 2)));
return $info;
}

$middle_seek = ceil((($end - $begin) / 18) / 2) * 18 + $begin;

fseek($fp, $middle_seek);
$middle_ip = implode('', unpack('L', fread($fp, 4)));
$middle_ip = sprintf('%u', $middle_ip);

if ($ip >= $middle_ip) {
$begin = $middle_seek;
} else {
$end = $middle_seek;
}
} while (true);
}
 


以上$fp为打开ip.dat的文件句柄,由于是循环检索,所以写在函数外面,免得每次检索都要打开一次文件,30W行数据二分法最多也只需要循环7次(2^7)左右即可找到准确的IP信息。之后本来还想将ip.dat放在内存中加快检索速度,后来发现,字符串定位函数的效率,根本和文件指针的偏移定位不是在一个数量级的,所以还是放弃使用内存来存放IP库。
 这个实现,使IP检索效率提高了近百倍

0

strlen、mb_strlen计算中英文混排字符串长度

Post by agang 2010-8-16 10:30 Monday

在php中常见的计算字符串长度的函数有:strlen和mb_strlen,下面是对这两个函数的比较说明(编码方式UTF8)

比较strlen和mb_strlen
当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。(测试时编码方式是UTF8)

 


$str='中文a字1符';
echo strlen($str);
echo '';
echo mb_strlen($str,'UTF-8');
//输出结果
//14
//6
 

 

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6

关于中英文混排串的占位符计算:
利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1),计算的方法是:如果一个混排字符串有a个中文,b个英文,占位是:

 

$str='中文a字1符';
//计算如下
echo ( strlen($str) + mb_strlen($str,'UTF-8') ) / 2;
//输出结果
//10
 


例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.

0