2011-03-06

PHP中静态调用非静态方法

类归于: PHP — 标签:, maker @ 20:52

1.PHP中可以静态调用非静态方法么?

今天我被问到PHP中可不可以使用 className::methodName() 的方法来调用一个没有声明Static的方法。在我的印象中,我好像是见过这种用法,但又有些不确定。大家都知道,在手册或者教程里,方法被分为静态方法和非静态方法,通常我们静态调用的方法,肯定是静态方法。

那如果我们调用了非静态方法会怎么样呢?首先做测试.
<?php
class test{
function test(){
echo 'it works';
}
}
test::test();

执行以下,返回错误如下
Fatal error: Non-static method test::test() cannot be called statically in /home/×××/test.php
on line 7 Call Stack: 0.0002 332548 1. {main}() /home/×××/test.php:0

这个时候,可能大家就会认为静态调用非静态方法是行不通的了,但其实,结论下的过早了,因为test()这个方法比较特殊,与类同名,是构造方法。

我们继续测试。
<?php
class test{
function test(){
echo 'it works';
}
function test2(){
echo 'it works too';
}
}
test::test2();

执行结果:
it works too
这说明,静态调用非静态方法是可行的,但是静态调用构造方法是不可以的。为了验证这个结论,我又做了如下测试:
<?php
class test{
static function test(){
echo 'it works';
}
}
test::test();

执行的结果如下:
Fatal error: Constructor test::test() cannot be static in /home/xxx/test.php on line 9
构造方法不能声明静态,所以上面的推论正确。

但这个结果的确是很特殊的,因为可能只有PHP可以静态调用非静态方法,我用Java做了实验,如果静态调用非静态方法会报如下错误:
Cannot make a static reference to the non-static method showString() from the type HelloWorldApp
其他语言我没有一一尝试,但这已经足够来说明PHP的特殊之处,关于为什么PHP会有这样的情况我暂时没有找到相关说明。

2.静态调用非静态方法是否应该被应用?

那我们是不是可以使用这种方法来代替static方法呢? 首先在代码的可读性上来看,静态调用非静态方法当然是不被推荐的,这会让维护者产生疑惑。

接下来我们再做一些实验,来看一下静态调用非静态方法在效率上是否会有一定的优势。
<?php
class test{function test2(){}}
for($k=0; $k<10000; $k++)
{
test::test2();
}

上面代码在我这里的执行时间是18到28毫秒,我们再来测试标准的写法。
<?php
class test{static function test2(){}}
for($k=0; $k<10000; $k++)
{
test::test2();
}

上面的代码执行时间在5到10毫秒之间,这样看来,静态调用非静态方法的效率要比标准的静态方法调用低的多,所以在效率上也不推荐静态调用非静态方法

2010-10-19

symfony系列文章归档

类归于: PHP, symfonymaker @ 13:24

由于种种原因,本站的symfony系列教程已经停止更新一年之久,又因种种原因,本站的编辑们也都停止了对本站的维护。

symfony是我使用过最经典的php框架,symfony可能不是最好的,但在我用过的种种框架中,symfony绝对是最优秀的,虽然,我现在已经连创建项目的命令都已经忘掉了,但是symfony的oo思想让我获益匪浅。

目前symfony的2.0版本已经在开发阶段,国内的symfony开发者也越来越多,本站绝大多数的symfony文章都是1.2版本的时候写的,可能已经跟不上时代,但其中的思想仍然值得广大symfony入门者参考,我对本站的symfony文章进行了一次整理,很遗憾没能把这些文章写成一个系列。

基础篇

进阶篇

高级篇

在此感谢站长bobhero和每一位做出过贡献的编辑们(排名不分先后)zhuozi,kthiz2006,hansir,szn000,duandi,同时也感谢各位读者对我们的支持。

2010-08-17

session 在 IE下失效 解决办法

类归于: PHPbobhero @ 09:22

工作中,遇到一个问题 ,同样的代码在FIREFOX 和 IE 下 表现 相差太多 ,查之 ,竟然是因为 session_id() 返回值的问题,解决过程如下
1. 测试 FIREFOX 和 IE ,IE每次刷新页面时 得到的SESSION_ID 值不一样,FIREFOX 一样
2.测试 IE6,IE7,IE8 竟然 只有IE7 有这种 现象………..
3.经多方查证,没有结果 ,网上没有人和我的情况一下,自己解决吧
4.我左三圈右三圈 ,最后发现 竟然 是 内裤 掉色 ……………………………………………………………

域名里 有 下线 “_” ,这个竟然 是BUG 所在点

结论: 在IE7 下 ,如果 域名里包括下划线,SESSION 将失效

如果你觉得本BLOG对你有帮助 ,请帮助其它人

2010-06-28

在IE下使用Script Debugger调试javascript兼容性问题

类归于: JavaScript — 标签:, , , maker @ 15:30

该死的浏览器战争,苦了我们这群web开发者,每天都要面对html兼容性,css兼容性,javascript兼容性! 还有什么比这更要命的么?

通常情况下, 我都用Firefox下的Firebug插件来开发Javascript应用, 但是经常会有代码在IE下就失去作用, 而且IE的错误提示还很模糊, 经常会让我无从下手.

以前听说过IE下的一些调试工具,从没用过,刚刚被一个语法错误逼的没办法向bobhero求助,他推荐我装了Script Debugger.

这是微软开发的一款开发工具, Google之, 进入微软的网站下载安装, 如果你不是Win98或者Win Me记得要下载 Script Debugger for Windows NT 4.0 and Later, 否则等着杯具去吧.

安装过程大概就是, 下一步->下一步->下一步->下一步->下一步->下一步….

安装完毕后, 进入Internet选项->高级, 如下图把禁用脚本调试(Internet Explorer)和禁用脚本调试(其他)两个选项关闭掉. 如果你忘了这步, 那么, 痛苦去吧, 你会发现和没装没什么差别.
ie-script-debugger-01

搞定上一步之后, 找你的错误去吧.
ie-script-debugger-02

ie-script-debugger-03

我刚刚发现我还装过另一个调试工具,我怎么就不记得了呢…

2010-05-27

vim配置文件注解

类归于: vi/vim — 标签:, kthiz2006 @ 16:00

最近,本人把自己的vim的配置文件整理了一下,现今拿出来晒晒与大家分享,附注释如下:

set nocompatible "设定 gvim 运行在增强模式下,不使用vi的键盘模式
set helplang=cn "设置帮助的语言
filetype on "设置文件类型的检测
filetype plugin on "为特定的文件类型允许插件文件的载入
set et "编辑时将所有 Tab 替换为空格
set sw=2 "自动缩进的时候, 缩进尺寸为 2 个空格
set sts=2 "设置 softtabstop 为 2. 输入 tab 后就跳了2格.
set smarttab "行首的 根据 'shiftwidth' 插入空白
let php_folding = 1 "折叠类、函数等
set backspace=indent,eol,start "不设定的话在插入状态无法用退格键和 Delete
set nobackup " 覆盖文件时不备份
set history=50 " 设置在命令行显示多少历史记录
set showcmd " 在状态栏显示目前所执行的指令
set incsearch " 输入搜索内容时就显示搜索结果
set number " 显示行号
"打开自动缩进和 C 语言风格的缩进模式,定制 C 语言缩进风格
set cindent
set autoindent
set mouse=a " 设定在任何模式下鼠标都可用
set scrolloff=5 " 设定光标离窗口上下边界 5 行时窗口自动滚动
set ignorecase " 搜索时忽略大小写
set smartcase "但在有一个或以上大写字母时,仍保持对大小写敏感
set hid " 允许在有未保存的修改时切换缓冲区,此时的修改由切换由 vim 负责保存
set shiftwidth=2 " 设定 << 和 >> 命令移动时的宽度为 4
set showmatch " 在输入括号时光标会短暂地跳到与之相匹配的括号处,不影响输入
"设置 折行
set textwidth=84
set wrap
syn on
set completeopt=menu,longest,preview
set confirm
"解决乱码
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-8
"设置CTAGS
"let Tlist_Ctags_Cmd = 'E:\vim72\ctag\ctags.exe'
let Tlist_Auto_Open =
let Tlist_Exit_OnlyWindow = 1
let Tlist_Use_Right_Window =1
let tlist_actionscript_settings = 'actionscript;c:class;f:method;p:property;v:variable'
set tags=./tags,./../tags,./**/tags
"设置配色方案
"colorscheme vibrantink
"设置字体
set guifont=Lucida_Console:h11:b
"设置 bufexplorer
map :FirstExplorerWindow
map :BottomExplorerWindow
map :NERDTreeToggle
"去掉烦死我的错误声音
set vb t_vb=
"工作目录随文件变
autocmd BufEnter * cd %:p:h
"设置状态栏
set statusline+=%f
"不显示工具条
set guioptions-=T
"显示横向滚动条
set guioptions+=b
"设置自动补全
setl omnifunc=nullcomplete#Complete
autocmd FileType * setl omnifunc=nullcomplete#Complete
autocmd FileType python setl omnifunc=pythoncomplete#Complete
autocmd FileType javascript setl omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html setl omnifunc=htmlcomplete#CompleteTags noci
autocmd FileType css setl omnifunc=csscomplete#CompleteCSS noci
autocmd FileType xml setl omnifunc=xmlcomplete#CompleteTags
autocmd FileType php setl omnifunc=phpcomplete#CompletePHP
autocmd FileType c setl omnifunc=ccomplete#Complete
"设定状态条
set cmdheight=1 " 设定命令行的行数为 1
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set statusline=%F%m%r,%Y,%{&fileformat}\ \ \ ASCII=\%b,HEX=\%B\ \ \ %l,%c%V\ %p%%\ \ \ [\ %L\ lines\ in\ all\ ]
"设置智能大小写查找
set ignorecase smartcase
"设置标尺
set ruler "打开状态栏标尺
"设置制表符
set cindent shiftwidth=2
set softtabstop=2
set smarttab
set list "显示制表符
set listchars=tab:>-
"设置标签
function GuiTabLabel()
let label = ''
let bufnrlist = tabpagebuflist(v:lnum)
" 如果标签页里有修改过的缓冲区,加上 '+'
for bufnr in bufnrlist
if getbufvar(bufnr, "&modified")
let label = '+'
break
endif
endfor
" 如果标签页里的窗口数目多于一,加上窗口数目
let wincount = tabpagewinnr(v:lnum, '$')
if wincount > 1
let label .= wincount
endif
if label != ''
let label .= ' '
endif
" 附加缓冲区名
label . bufname(bufnrlist[tabpagewinnr(v:lnum) - 1])
endfunction
set guitablabel=%{GuiTabLabel()}
set guitablabel=%N\ %f
"设置php注释
"source $vimruntime\vimfiles\plugin\php-doc.vim
inoremap :call PhpDocSingle()i
nnoremap :call PhpDocSingle()
vnoremap :call PhpDocRange()
"设置putty
let g:netrw_sftp_cmd = "PSFTP"
"设置quickfix
"php语法检查
setlocal makeprg=\"d:\wamp\bin\php\php5.2.6\php.exe\"\ -l\ -n\ -d\ html_errors=off\ %
setlocal errorformat=%m\ in\ %f\ on\ line\ %l
"autocmd BufWritePost *.php,*.phps :make
map :w:noh:make

下面是我的vim的配置文件的下载链接:
vimrc

早前文章 »

WordPress 所驱动