在PHP中,静态变量的解释是存在于类作用域的变量,在第一次初始化时给变量赋值,以后类初始化时,静态变量将不会再被重新赋值,主要用于一个类具有多个实例时的变量共享,以下为PHP的静态变量使用代码:
class A {
static $i = 10;
public function set($n)
{
self::$i = $n;
}
public function get()
{
return self::$i;
}
}
$a = new A();
$a->set(11);
$a1= new A();
echo $a1->get();
输出结果为11,可以看到类A在第二次实例化后,静态变量$i依然与上一次实例化时后设定的$i值是一致的。用java来解释,其实就是一个类的静态变量在多个实例中都使用了一个内存空间,我觉得这样解释更加便于理解。因为静态变量和静态方法不需要实例化就可以使用,因而在文件被加载后静态变量就会初始化,而静态方法则会被注册。这也就可以理解,为什么java类的入口会这样的了:
public static void main(String[] args)
{
}
我以前一直觉得由于静态方法不需要实例化就可以直接使用,节约了实例化的巨大开销,因而在使用一个类的方法时我更加倾向于直接静态调用而避免实例化。对于这个问题,我与同事已经争论过很多次,他不主张静态调用主要有以下想法:
1.实例化类更加符合面向对象编程的思想;
2.静态调用方法并不能在消耗上有较大的节约。
对于这个问题,我还是坚持自己的观点,但也并不是无论什么时候都使用静态调用。我主要有以下想法:
1.由于静态变量在文件被载入时就会被初始化,因此如果有多个类,并且类中存在多个静态变量与方法,势必在还未实例化时已消耗较多的内存(未验证)。所以对于访问不频繁或特殊需要,不建议将一个方法设为static;
2.对于调用较为频繁的类,我强烈建设使用static静态和静态方法,不仅可以共享内存空间,还可以共享数据。细心就会发现目前主流的PHP框架的基类都是使用的静态调用方法。
前几天公司的一个项目组的同事反应说公司内部的一台Linux服务器上的MySQL没有InnoDB这个引擎,我当时想应该不可能啊,MySQL默认应该就已经安装了这个引擎的吧,于是上服务器去看了看,发现还真没有,于是putty到服务器上,show engines看了一下:
+------------+---------+
| Engine | Support |
+------------+---------+
| CSV | YES |
| MRG_MYISAM | YES |
| MEMORY | YES |
| MyISAM | DEFAULT |
+------------+---------+
列表中没有InnoDb,第一反应是不是安装MySQL的时候没有编译InnoDb呢?但心想MySQL应该是自带了的,但google发现有网友说因为InnoDb是以插件的方式加载到MySQL中的,所以可以直接使用install plugin innodb soname 'ha_innodb.so'来启用InnoDB,但首先我们需要查看一下是否已经编译InnoDb:
mysql> show plugins;
+------------+--------+----------------+---------+---------+
| Name | Status | Type | Library | License |
+------------+--------+----------------+---------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
+------------+--------+----------------+---------+---------+
但是发现连插件里面都没有,这下可以确定是没有编译了,于是决定对MySQL重新编译,当然编译前请先备份所有数据库,以免造成数据丢失。
[root@192.168.1.1]# mysqldump --all-database -u root -p > /data0/www/1.sql
[root@192.168.1.1]# mysql-5.1.60]#screen -S stou
[root@192.168.1.1]# mysql-5.1.60]#automake --force --add-missing
[root@192.168.1.1]# mysql-5.1.60]#./configure --prefix=/usr/local/mysql/ --with-plugins=innobase
最近一个项目中使用了ThinkPHP做为开发框架,URL上我们使用了PATHINFO模式,但是Nginx默认是不支持PATHINFO的,需要进行手动配置才可以,于是我们按照了以下方法进行了Nginx的PATHINFO支持配置:
修改nginx.conf,找到server中的 location ~ .php${},修改为location ~ .php {},并在其中增加以下内容:
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
不过无论我们如何测试,都发现PATHINFO模式总是不能正确运行,就算运行后,{:U}方法也总是出错,打印$_SERVER后发现PHP_SELF总是为“/”,因为我们Nginx版本为0.7.54我们开始怀疑是不是版本自身的BUG?于是我将Nginx进行了无缝升级至1.0.12,代码如下:
cd /usr/download/
wget http://nginx.org/download/nginx-1.0.12.tar.gz
tar -zxvf nginx-1.0.12.tar.gz
cd nginx-1.0.12
/opt/nginx -V
./configure (上面的configure结果)
make
mv opt/nginx /opt/nginx.old
cp objs/nginx /opt/nginx
make upgrade
但是依然PATHINFO不能正确正常工作,于是我们确定是ThinkPHP的配置问题,正在我们不知道怎么办时,同事发现其实是ThinkPHP的_PHP_FILE的问题,在入口文件index.php中加入配置define('_PHP_FILE_',$_SERVER['SCRIPT_NAME']);,问题解决。
最近公司的一个项目中要使用到Web Service,虽然以前也有了解过Web Service,但对于Web Service的架构方式、Web Service相关的概念SOAP、WSDL、RPC、REST还不太清晰,于是最近对Web Service相关的理论进行了一次学习,特记录下来以便以后复习。
1、什么是Web Service?
Web Service是一种基于HTTP的通信协议,主要用于解决应用程序与应用程序间(特别是web应用程序)的通信,比如:百度推广的API就是采用的Web Service的方式为用户提供自行开发应用访问“鸟巢”,腾讯微博和新浪微博客的开发平台也是采用的Web Service的方式提供服务。
2、为什么要采用Web Service?
Web Service具有比HTTP更灵活、更可移植、更方便的跨平台和分布式布置的优势。之所以会出现Web Service是因为传统的两套应用程序(特别是一些web应用程序)间采用HTTP的方式进行通信时,不仅存在解析DOM麻烦、数据传输不方便等问题,还存在对接口了解少而引起的开发过程缓慢等问题。而Web Service不仅是基于HTTP而进行的通信,还采用了现在主流的XML做为数据传输方式支持RPC的方法调用远程过程,同时WSDL(Web ServiceDescription Languge)更加系统的描述了Web Service开发中各个接口的输入输出、数据类型等,极大的提高了开发的效率,同时SOAP实现了更加方便的OO编程。
3、SOAP与Web Service
SOAP(Simple Object Access Protocol)即简单对象访问协议,简单点说其实SOAP就相当于XML+RPC:以XML作为数据载体,调用服务器上预定义的过程,从而直接使用已定义的方法提高开发效率和程序的可控性。SOAP的伪代码如下:
PHP代码
- Server:
- class A {
- public function sayHi()
- {
- print "Hi";
- }
- }
- Client:
- $soap = new SoapClient($wsdl);
- $soap->sayHi();
有好长一段时间没有写博客了,但每天至少都会来博客上看看,前几天查看流量发现石头博客的流量已经基本全靠搜索引擎和几个朋友支持着,倍感凄凉。不过,看到有些老朋友依然时不时来来关注,很是感动,回访以前经常访问的朋友们,好多也已物是人非。大猪那家伙都没听说有女朋友,前几天竟然都结婚了!桶哥没有怎么更新博客了;天边鱼的博客依然如初:总能看到真诚的东西;HP怕是放弃Zblog了,社区也没有看到什么新的东西……
费话多了点,今天给博客加了个新年快乐的banner,是女友设计的哦~现在把如何实现跟大家分享。注:此方案只适用于石头博客专用主题V2,V3。
上传banner图片至博客附件(点此下载banner图片),然后取得图片在你空间的URL地址。修改主题当前样式default.css/twiiter.css,找到popbg这样类,并将其样式替换为以下内容:
CSS代码
- clear:both;
- display:block;
- width:950px;
- height:153px;
- background:url('你的BANNERURL') rightright no-repeat;
- position:absolute;
- top:0px;
- left:50%;
- margin-left:-475px;
- _background:none;
- _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=crop,src='你的BANNERURL');
- _margin-left:-290px;
保存,刷新前台即可。
今日难得重庆阳光天蓝,和女友慢哒慢哒滴往南滨路走去,从另一个方面感受了重庆这座城市,忘记写不完的代码,忘记做不完的项目。文中有我的照片哦,大家点吧点吧!!
云森设计是我以前一个设计师同事自己开的设计公司的品牌,前段时间他找到我说希望我为他做一个网站,他自己设计了PSD,需要我将其转为html并植入程序,要求结构简单,利于SEO。此网站也是基于Zblog的,但是在Zblog的基础上做了部分调整,添加了以下比较实用但Zblog1.8没有功能:1.不同的分类调用不同的模板
用过猴子好久的空间了,一直猴总都在辛勤默默地奉献着,为石头博客提供着强大的后台硬件支持。但由于与猴子远隔一方,从来没有机会能当面表示感谢!最近鉴于自己对Linux小有熟悉,于是决定购买VPS,将博客独立出来单独管理,一来增加Linux的平台操作经验,二来是也希望减少猴总的麻烦。
HTML中的select元素是一个可以进行下拉选择的容器,但是由于select元素并不能用CSS进行有效的外观设计,造成在许多追求一体效果的网页中必须要使用下拉框时非常麻烦。diyselect是一款可以自动将网页中的select元素改变为可以输入、可下拉选择、自动补全、美观的jquery插件,可以方便快速的替换网页中的select元素。
Zblog图文列表插件是我去年的时候在Zblog的基础上生产的一款简单的按条件生成图文列表的插件,由于那会Zblog上还没有类似的这样的插件,所以不管是在抢楼活动中的发送,还是以50元/份的方式进行的出售,都受到了大家热情的关注,但是直到现在还是有许多人一直在向我索取。
以前我并不知道有谭咏麟这样一个歌手(囧),第一次听他的歌是公司一次聚会的时候。那次大家都喝得不少,后来KTV时一位同事深情的唱了谭咏麟的这首《讲不出再见》,借助着酒兴突然觉得好受感染,虽然自己不懂粤语,但却情不自禁的跟着哼了起来,正是这次我记住了谭咏麟。
昨天是我们项目组最为坎坷的一天,我们经历了由紧张到绝望再到希望的过程……辛苦了差不多两个月的项目本来预计是昨天下午在给另外一个用户群进行测试的,前天其实整套系统都已经非常流畅,但是为了方便另一个用户群的测试,需要将我们B/S和C/S都移架到另一个对外的服务器上,于是问题就在这个过程中产生了。