如果你想根据时间来判断某一时间值(用秒数表示)是否在今天的范围之内。下面这个函数,将帮你轻而易举的判断。 函数源代码: --------------------------------------------- 说明:若$varTime在今天的范围内,返回ture,否则返回false. function bTodayToTomorrow($varTime) {     $nowYear=date("Y");     $nowMonth=date("n");     $nowDay=date("j");     $aryTodayAndTomorrow["Today"]=date("U",mktime(0,0,0,$nowMonth,$nowDay,$nowYear));     $aryTodayAndTomorrow["Tomorrow"]=date("U",mktime(0,0,0,$nowMonth,($nowDay+1),$nowYear));     if($varTime>=$aryTodayAndTomorrow["Today"]&&$varTime<$aryTodayAndTomorrow["Tomorrow"])     {         return true;     }     else     {         return false;     } } ------------------ 类似的你可以进行任意时间段的判断。

以前对面向对象仅限于死记硬背型,工作这么久了,回过头来看又是一翻体悟,供大家看看。1.finalfinal:php5新增一个final关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法;如果一个类被声明final,则不能被继承。复制代码 代码如下:class BaseClass{     public function test(){          ehco "test";     }     final public function moreTest(){          echo "moretest";     }}class ChildClass extends BaseClass{     public function moreTest(){          echo "moretest";     }}// 产生 Fatal error: Cannot override final method BaseClass::moretest()2.__toString(建议用PHP5.2或者更高版本)复制代码 代码如下:class Person{     protected $name;     protected $email;     public function setName($name){          $this->name = $name;     }     public function setEmail($email){          $this->email = $email;     }     public function __toString(){          return "$this->name <$this->email>";     }}$rasums = new Person;$rasums->setName('test');$rasums->setEmail('[email protected]');print $rasums;3.接口和抽象类接口的作用:你想要保证一个类按照特定的名称、可见性和原型实现一个或多个方法。接口的要求:     类中全部为抽象方法     抽象方法钱不用加abstract     接口抽象方法属性为public     成员属性必须为常量例:复制代码 代码如下:interface ChildTest{     public function childTest();}class FathTest implements ChildTest1,ChildTest2{     public function childTest(){          echo 1;     }     …………}抽象的作用: 其实抽象类和接口类有一部分很像,记得在哪里看见这样一句话,抽象类就把类像的部分抽出来,这句看上去很搞笑,其实它说出了抽象类的真理,抽象类的作用 是,当你发现你的很多类里面用很多方法你不断的在重复写,那你就可以考虑使用抽象类了,你可能会说“我不是可以重写一个类每个公共类我个实例化一个这个公 共类,调用相同的方法就可以了”,这里是可以,实际上抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤,让你就像直接调用本类方法一样方便,而 且你还可以重载这个方法。抽象的要求:     类中至少有一个抽象方法     抽象方法钱必须加abstract例:复制代码 代码如下:abstract class Database{     abstract public function connect();     abstract public function query();     abstract public function fetch();     abstract public function close();}注:抽象方法不能定义为私有方法、不能定义为最终方法,因为它们需要被继承。4.传递对象引用php4:所有“=”都是创建一个副本php5:除了对象外,其他“=”进行赋值时,都是创建一个副本;而对象则是引用5.克隆对象一、聚合类:__call方法简介:当客户端代码用类中未定义的方法时,__call会被调用。__call()接受两个参数,一个是方法名称,另一个是传递给要调用方法的所有参数(包括数组)__call()方法返回的任何值都会返回给客户,将好像调用方式真实存在一样例:复制代码 代码如下:class Address{     protected $city;     protected $country;     public function setCity($city){$this->city = $city;}     public function getCity(){return $this->city;}     public function setCountry($country){$this->country = $country;}     public function getCountry(){return $this->country;}}class Person{     protected $name;     protected $address;     //浅克隆     public function __construct(){          $this->address = new Address;     }     public function setName($name){          $this->name = $name;     }     public function getName(){          return $this->name;     }     public function __call($method,$arguments){          if(method_exists($this->address,$method)){               return call_user_func_array(array($this->address,$method),$arguments);          }     }     //深克隆     public function __clone(){          $this->address = clone $this->address;     }}$test1 = new Person;$test2 = clone $test1;$test1->setName('testname1');$test1->setCity('testcity1');$test2->setName('testname2');$test2->setCity('testcity2');echo $test1->getName().'-'.$test1->getCity()."\n";echo $test2->getName().'-'.$test2->getCity()."\n";//testname1-testcity2//testname2-testcity26.重要属性访问(__set __get __isset __unset) __isset __unset5.1之后才有用作用:拦截对属性的需求,为了提高分离的程度,还要实现__isset()和__unset(),以便当我们用isset来检测属性或者unset()来删除属性,来保证类的行为正确例:复制代码 代码如下:class Person{     protected $__data = array('email','test');     public function __get($property){          if(isset($this->__data[$property])){               return $this->__data[$property];          }else{               return false;          }     }     public function __set($property,$value){          if(isset($this->__data[$property])){               return $this->__data[$property] = $value;          }else{               return false;          }     }     public function __isset($property){          if(isset($this->__data[$property])){               return true;          }else{               return false;          }     }     public function __unset($property){          if(isset($this->__data[$property])){               return unset($this->__data[$property]);          }else{               return false;          }     }}$test = new Person;$test->email= 'test';var_dump($test->email);注意:     这两个方法只会捕捉缺少的属性,如果你为你的类定义了一个属性,那么当访问这个属性时php不会调用__get()和__set();     这两个方法完全破坏了任何属性继承的想法。如果父对象中有个 __get()方法,而你在子类中又实现了自己的__get()方法,那么你的对象不会正确的执行,因为父类的__get()方法永远不会被调用,当然可以用parent::__get()解决缺点:     速度相对较慢     使用魔术访问器方法就不可能在使用反射类,

什么是多态性? Polymorphism(多态性)是一个很长的单词,但是它表示的是一个非常简单的概念。 多态性描述了在面向对象编程模式中类有不同的功能,而共享一个通用的接口。 多态性的优点是,并不需要知道它使用的是哪一个类,因为他们都用同样的方式与不同的类的代码工作。 可将多态性类比成现实世界的一个按钮。大家都知道如何使用一个按钮:您只需给它施加压力。一个按钮“确实是这样”,然而,取决于它和什么连接和使用它的上下文 - 但结果并不影响它是如何使用。如果你的老板告诉你按下一个按钮,您已经有执行任务所需的所有信息。 在编程的世界中,多态性是用来使应用程序更加模块化和可扩展的。相比于凌乱的条件语句描述的行动不同的课程,您可以创建根据您的需求选择的互换对象。这是多态性的基本目标。 Interfaces接口 接口是与类(class)类似的,除了它不能包含代码。接口可以定义方法名称和参数,但不是方法的内容。实现接口的任何类都必须实现接口中定义的所有方法。一个类可以实现多个接口。 使用的“interface”关键字声明一个接口: 复制代码 代码如下: interface MyInterface { // methods } 被附加到一个类,使用“implements”关键字(多个接口,可以通过用逗号分开): 复制代码 代码如下: class MyClass implements MyInterface { // methods } 在接口中可以像在类中一样定义方法,除了没有方法体(在大括号中的部分)以外。 复制代码 代码如下: interface MyInterface { public function doThis(); public function doThat(); public function setName($name); } 在这里定义的所有方法都必须如接口中所描述地那样被包含在任何实现它的类中。(读下面的代码注释) 复制代码 代码如下: //合法的 VALID class MyClass implements MyInterface { protected $name; public function doThis() { // code that does this } public function doThat() { // code that does that } public function setName($name) { $this->name = $name; } } // 非法的INVALID class MyClass implements MyInterface { // missing doThis()! private function doThat() { // this should be public! } public function setName() { // missing the name argument! } } 抽象类Abstract Class 抽象类是接口和类的混合。它可以像接口一样定义方法。继承自抽象类的类必须实现抽象类中定义的所有抽象方法。 抽象类的定义方式与类一样,不过是在前面附加了一个abstract 关键字。 复制代码 代码如下: abstract class MyAbstract { // methods } 并且 是用 ‘extends‘ 关键字附加到类: 复制代码 代码如下: class MyClass extends MyAbstract { // class methods } 就像在普通类中一样,普通的方法以及任何抽象方法(使用关键字“abstract”)可以在抽象类中定义。抽象方法的行为就像在接口中定义的的方法,而且继承它的扩展类中必须实现完全一样的定义。 复制代码 代码如下: abstract class MyAbstract { public $name; public function doThis() { // do this } abstract public function doThat(); abstract public function setName($name); } 我们假设你有一个文章Article类负责管理你网站上的文章。它包含关于文章的信息,包括:title, author, date, and category. 就像下面这样: 复制代码 代码如下: class poly_base_Article { public $title; public $author; public $date; public $category; public function __construct($title, $author, $date, $category = 0) { $this->title = $title; $this->author = $author; $this->date = $date; $this->category = $category; } } 注意:在这个教程中的示例类使用了“package_component_Class”的命名约定,这是一个用来将类名分隔到虚拟的命名空间来避免命名冲突的通用方法。 现在你想添加一个方法来输出各种不同格式的信息,如XML和JSON。你也许会打算像下面这样做: 复制代码 代码如下: class poly_base_Article { //... public function write($type) { $ret = ''; switch($type) { case 'XML': $ret = ''; $ret .= ''; $ret .= '' . $obj->author . ''; $ret .= '' . $obj->date . ''; $ret .= '' . $obj->category . ''; $ret .= ''; break; case 'JSON': $array = array('article' => $obj); $ret = json_encode($array); break; } return $ret; } } 这种解决方案是丑陋的,但是它是可靠的——至少在现在。问下你自己将来会发生什么,当我们需要添加更多格式的时候?你可以继续编辑这个类,然后添加越来越多的case , 但是现在你只是在稀释(FIX ME: diluting) 你的类。 OOP的一个重要原则是一个类应该做的一件事情,而应该把它做好。 考虑到这一点,条件语句应该是一个红色的标志,表明你的类是试图做太多不同的东西。这是多态性的用武之地。 在我们的例子中,有两个任务明确的提出:管理文章和格式化其数据。在本教程中,我们将重构我们的格式化代码到一个新的类,然后我们会发现使用多态性是多么容易。 Step 2: 定义你的接口 Define Your Interface 第一件事就是我们应该定义接口,努力想好怎么定义你的接口是件重要的事情,因为对它的任何改变都将需要改动调用它的代码。 在我们这个例子中,我们将使用一个简单的接口来定义一个方法: 复制代码 代码如下: interface poly_writer_Writer { public function write(poly_base_Article $obj); } 它就是那样简单,我们已经定义了一个公用方法write() ,它接受一个文章对象作为参数。任何实现Writer接口的类都将会确保有这个方法。 小提示:如果你想严格限制传递给你的方法和函数的参数类型,你可以使用类型提示,就像我们已经在write()方法中做的一样,它只能接受poly_base_Article 对象类型的数 据。不幸的是,在目前版本的PHP中,返回类型提示是不被支持的,所以,你要小心返回值的类型了。 Step 3: 创建实现类 Create Your Implementation 定义接口后,该是时候来创建类来真正干活的啦。在我们的例子中,我们需要输出两种格式。这样,我们就要两个Writer 类:XMLWriter 和 JSONWriter 。从传递过来的 Article 对象提取数据然后格式化这些信息完全取决于这些类了。 下面是 XMLWriter 类的一个示例: 复制代码 代码如下: class poly_writer_XMLWriter implements poly_writer_Writer { public function write(poly_base_Article $obj) { $ret = ''; $ret .= ''; $ret .= '' . $obj->author . ''; $ret .= '' . $obj->date . ''; $ret .= '' . $obj->category . ''; $ret .= ''; return $ret; } } 就如你可以从类定义中看到的一样,我们使用implements关键字来实现我们的接口。write() 方法包含格式化为XML的功能。 现在我们来看下JSONWriter 类: 复制代码 代码如下: class poly_writer_JSONWriter implements poly_writer_Writer { public function write(poly_base_Article $obj) { $array = array('article' => $obj); return json_encode($array); } } 现在,我们的代码中的特定每种格式都包含在单独的类。每个类有全权负责处理特定的格式,而不是其他。您的应用程序中没有其他部分需要关心这些是如何工作的才能使用它, 感谢我们的接口。 Step 4: 使用你的接口Use Your Implementation 在我们的新类定义后,该是时候来重温一下我们的Article类了,所有原write() 方法中的代码已经被分离出来,进入到我们的新类中了。 我们的所有方法现在需要做的就是使用这些新的类,像这样: 复制代码 代码如下: class poly_base_Article { //... public function write(poly_writer_Writer $writer) { return $writer->write($this); } } 获取一个 Writer对象 Obtaining A Writer 你也许会疑惑你该从哪里获取一个 Writer对象开始,因为你需要传递一个 Writer对象到这个方法。 这完全取决于你,并且,有很多策略。如,你可能会使用工厂类来获取请求数据然后创建一个对象: 复制代码 代码如下: class poly_base_Factory { public static function getWriter() { // grab request variable $format = $_REQUEST['format']; // construct our class name and check its existence $class = 'poly_writer_' . $format . 'Writer'; if(class_exists($class)) { // return a new Writer object return new $class(); } // otherwise we fail throw new Exception('Unsupported format'); } } 就像我说的,根据你的需求,有好多其它策略可用。在这个例子中,通过一个请求变量选择哪种格式是要使用的。它基于request请求变量来构造一个类名,检测它是否存在, 然后返回一个新的Writer对象。如果没有那个名字的类存在,抛出一个异常,让客户端代码决定接下来要干什么。 Step 5: 把它们放一起 Put It All Together 当所有东东都到位了,下面是我们的客户端代码如何放在一起: 复制代码 代码如下: $article = new poly_base_Article('Polymorphism', 'Steve', time(), 0); try { $writer = poly_base_Factory::getWriter(); } catch (Exception $e) { $writer = new poly_writer_XMLWriter(); } echo $article->write($writer); 首先,我们创建了一个示例 Article 对象来配合工作。然后,我们试图从工厂Factory获取一个Factory对象,如果异常发生的话回滚到默认(XMLWriter) 。 最后,我们传递Writer对象给我们的Article的 write() 方法,输出结果。 结论 Conclusion 在本教程中,我提供了一个多态性的简介而且解释了PHP中的接口。我希望你意识到,我只向您展示一个潜在的使用多态性的案例。 多态性是以一个优雅的方式来避免您的OOP代码中丑陋的条件语句。它遵循的原则是使您的组件分离,而且它是许多设计模式的组成部分。如果您有任何问题,不要犹豫,在评论中提问! 译自:http://net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/ 原文发表在:http://ihacklog.com/?

很多程序员在CI中使用session的时候,开启自动加载session之后网站就报错了,具体错误信息如下:In order to use the Session class you are required to set an encryption key 下面一起来看问题解决办法。提示信息说明:如果想用session类的话就必须要设置一个加密的密钥!那就给设置一个吧,毕竟也是出于安全考虑。打开application/config/config.php找到Encryption Key复制代码 代码如下:/*|--------------------------------------------------------------------------| Encryption Key|--------------------------------------------------------------------------| If you use the Encryption class or the Session class you| MUST set an encryption key.  See the user guide for info.*/$config['encryption_key'] = 'xxxxx';//在这里加上密钥即可正常!

1.在新空间重新安装一次原版本的DEDECMS,然后把旧站的所有数据,这里的数据指的是文件,即除了根目录下文件夹include下的配置文件config_base.php外的所有文件覆盖到新空间下2.在旧网站后台系统管理-数据备份哪里备份数据,这里的数据指的是DEDECMS自己后台所采取的备份文件,类似用phpmyadmin等工具所作的备份。备份完成后,DEDECMS会将备份文件放到根目录下的dede目录(默认是dede,如果你修改了,就是你修改后的目录)下的backup_data文件夹里面,你会发现是许多文本文件。3.在新网站打开后台(注:这里域名已经解析到新站),系统管理-数据备份-还原数据-开始还原数据,直接还原就行了。注意:备份数据的时候指定备份数据格式那里一定要注意,一定要提前咨询新空间商,然后在决定是选择3.x/4.0.x还是选择4.1.x/5.x版本,不然备份错误,老网站又进不去,你就等着哭吧!o(∩_∩)o..第一 : 空间和空间之间搬家其实空间和空间之间搬家时最方便的,大家掌握好我说的步骤,100%能成功搬家,首先大家进入DEDE后台,选择系统-数据库备份-全选-然后点开始,这里要看下你的数据库对应版本要和新空间的数据库版本一样才可以,不然会出现乱码。等一会就会提示所有数据备份完毕,根据你的数据库大小时间不一定,备份完后,大家打开你网站的FTP,看一下data\backupdata目录中有txt文件,这就是我们刚才备份的数据了,如果不确定话可以看一下文件的创建日期。然后把这个backupdata文件夹连同的内容一起下载到本地,继续,把images,templets,uploads,plus这4个文件夹全部下载到本地。最后我们把新空间重新安装 DEDE程序,要对应你的版本,安装好后,把这几个文件夹覆盖到根目录,进入后台,选择系统-数据库还原-数据还原,就会看到你的数据库信息,全选后点击开始还原数据,一会就完了,然后选择你的首页文件,更新首页就OK了,这样我们的空间搬家就完成了。第二:后台无法备份数据库怎样搬家由于种种原因,我们的后台进不去了,或者数据库无法备份,那么我应该怎么搬家那?首先我们用PHPMYADMIN进入SQL数据库,这个应该都会把,不会的话百度一下,选择你的数据库然后备份,导出到本地,然后把你原来空间的所有文件全部下载到你的新空间中,继续打data这个文件夹当中的 common.inc.php这个文件,修改你的新空间数据库账户密码和IP,然后覆盖,这样就可以了,但是不适合菜鸟使用这种方法,除非真的没办法了,推荐第一种搬家方法,这一种方法多多少少可能有点小问题,我的网站就是昨天从空间搬到了VPS服务器,用这种方法出现了后台无法更新,不过很快解决了,是权限的问题。做网站,域名一般变动能性不大,空间却可能转来转去。一转就要涉及网站数据的般迁。以织梦内容管理系统Dedecms搭建的网站搬起家来方法不少,但有效的也只有一两种。由于Dedecms是用PHP编制,且需要MYSQL数据库才能撑起一个网站,WEB网页区与数据据库区一般不在同一地方,不象ASP程序编写的科汛、ZBLOG、赛特、新云等,WEB网页与ACCESS数据库是存在一起的,可以整站搬迁。但是,使用过Wordpress博客程序的朋友,大可以明白,PHP程序编写的网页打开的速度较ASP快一点,但静态生成效果不及ASP。让人庆喜的是织梦内容管理系统Dedecms可以实现文章地址全静态化,实是难通可贵。而且,织梦内容管理系统Dedecms做出来的网站也可以整站搬迁,方法如下:一、登陆你的DEDECMS后台,在“系统”区找到“数据库备份/还原”,将数据库进行“备份”;二、将老空间里所有的文件,全部下载至你的电脑本地;三、将文件上传至新空间;四、在新空间安装DEDECMS系统,方法——在织梦的官方网站下载一个新的安装系统,将系统里的“install”文件夹里的东西传至空间,进行覆盖。接着,运行http://你的域名/install,进行安装。需要注意的是:数据库表的前缀必须和原数据库表的前缀必须一致(按默认操作即可);五、安装完后,登陆后台,点击“系统”区的“数据库备份/还原”,将数据进行“还原”;六、数据生成,搬家工作完成。当然,还有一种效防Wordpress博客搬家的方法:一、把旧空间的文件下载到本地,通过PHPADMIN,将 MYSQL备份至本地;二、将网站文件上传到新空间,数据库通过PHPADMIN导入了;三、修改 dede安装时填写的数据库名和密码:打开“include”目录下的config_base.php,把这个文件下载下来查找 “数据库连接信息”,把下面的参数(数据库名和密码)更改一下就可以了,上传覆盖。四、搬家完毕。至于哪种方法最好,那就仁者见仁,智者见智了。这里提醒一下,如果你网站的mysql数据库超过20M,最好采取上面第一种方法(又叫重装法),因为有些空间商的数据库导入设有大小限制(一般不能大于20M)——用重装法就可以避过这种限制。dedeCms搬家说明-官方教程绝对有够详细因为不同虚拟主机空间的mysql数据库名称是各不相同的(因为其前缀不一样的,用过就知道了),所以要首先备份数据库,然后放到新空间还原,再重新生成html即可。(注意:新空间和原站的MYSQL数据库的版本必须同样是4.1以上,或同是4.0、4.0以下,以免出现问题。查看版本可以登陆PHPMyAdmin就可看到版本是多少)新空间重新安装同一版本的dedecms系统时,数据库名称和数据库用户名和密码当然是填新数据库的了,设置的数据库表的前缀必须和原数据库表的前缀一致,以免看不到内容。具体是这样:1.登陆后台,备份数据库(这个数据库备份文件是保存在../dede/backupdata/),并记住登陆后台的用户名和密码。2.下载数据库备份文件(即../dede/backupdata/这个文件夹)、网站风格模板文件(即../templets/这个文件夹),还有../upimg/这个文件夹(这是保存所有上传文件的文件夹)。3.在新空间重新安装同一版本的dedecms系统,这时设置的数据库表的前缀必须和原数据库表的前缀一致,以免看不到内容。(数据库名称和数据库用户名和密码当然是填新数据库的了)4.上传原站的../dede/backupdata/和../templets/和../upimg/这3个文件夹覆盖新空间中对应的文件夹,这样就把原站的数据库备份文件和网站风格模板放到新站了。5.登陆新空间后台>系统设置>数据库管理>数据库还原,进行数据库恢复还原,然后设置网站的“修改系统参数”(或“系统变量配置”),全站重新生成html即可。数据库恢复后,后台登陆用户名和密码要使用备份前原网站后台的登陆用户名和密码。不同空间的mysql数据库的默认字符编码不一样,为了防止出现乱码,你备份旧的数据库的时候看清楚原先的编码(一般是latin或者是gbk的),恢复数据库的时候要看新的数据库是否支持你的编码(有的数据库不支持 gbk),

分类:腾博会官方网

时间:2016-08-17 08:14:14