PHP类的静态方法与非静态方法之间调用

class A{
    public function fun1(){}
    static public function fun2(){}
}

classB{
    public function fun3(){}
    static public function fun4(){}
}

两个类 之间, A 与 B 相互调用方法是没有问题

//fun3() 中调用 fun1(), fun2() 成功
fun3() {
    A::fun2();
    myclass = new A();
    myclass->fun1();
}

//fun4() 中调用 fun1(), fun2() 成功
fun4() {
    A::fun2();
    myclass = new A();
    myclass->fun1();
}

fun1()可以用 $this->fun2() 调用fun2()
fun3()可以用 $this->fun4() 调用fun4()

但是
fun2()不可以用 $this->fun1() 调用fun1()
fun4()不可以用 $this->fun3() 调用fun3()

只需要记住关键一点 static修饰的静态方法中 不能用 $this
如果想实现上述 在fun2()中调用fun1() 只能是 new 一个方法
具体实现如下:

fun2() {
    $myclass = new self();
    $myclass->fun1();
}
//或者
fun2() {
    $myclass = new A();
    $myclass->fun1();
}

version libmysqlclient_18 not defined in file libmysqlclient.so.18 with link time reference

最近编译php的时候在加入mysql编译参数的时候报错,然后我就仔细的研究了下

基本情况
系统:CentOS-6.5
数据库:之前yum安装了mysql后来卸载掉,编译安装了mysql
php:我电脑里装了两个版本的php
一个是yum安装的 php-5.4.28
另一个是编译安装的 php-5.3.28

以下是各种报错

[root@localhost php-5.3]# php-fpm
[09-Jun-2014 15:37:41] NOTICE: PHP message: PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysql.so' - /usr/lib64/mysql/libmysqlclient.so.18: version `libmysqlclient_16' not found (required by /usr/lib64/php/modules/mysql.so) in Unknown on line 0
[09-Jun-2014 15:37:41] NOTICE: PHP message: PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysqli.so' - /usr/lib64/mysql/libmysqlclient.so.18: version `libmysqlclient_16' not found (required by /usr/lib64/php/modules/mysqli.so) in Unknown on line 0
[09-Jun-2014 15:37:41] NOTICE: PHP message: PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_mysql.so' - /usr/lib64/mysql/libmysqlclient.so.18: version `libmysqlclient_16' not found (required by /usr/lib64/php/modules/pdo_mysql.so) in Unknown on line 0
[root@localhost php-5.3]#
version libmysqlclient_18 not defined in file libmysqlclient.so.18 with link time reference
/usr/lib64/mysql/libmysqlclient.so.18: version `libmysqlclient_16' not found (required by /usr/lib64/php/modules/mysql.so) in Unknown on line 0

错误分析
是64位系统中 libmysqlclient 默认安装到了 /usr/lib64/mysql/ 目录下
如果此目录没有加入到 /etc/ld.so.conf里面,Linux就无法自动加载 /usr/lib64/mysql/ 里面的库文件
php编译时要去 /usr/lib64 和 /etc/ld.so.conf 所指定的目录下查找,却找不到 libmysqlclient 文件

解决方法一

ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18(mysql是编译安装的使用此行) ln -s /usr/lib64/mysql/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18 (myslq非编译安装的使用此行)

解决方法二: 也可以把mysql库加入/etc/ld.so.conf.d里面

备注:
我两个php用的libmysqlclient版本不一样,我要经常切换
一个用 libmysqlclient.so.18.0.0
另一个 libmysqlclient.so.18.1.0

php安装oracle拓展,php安装oci8,php连接oracle数据库

本文主要叙述,php环境与oracle数据库不在同一台服务器上时,php环境的安装编译

按照官方说明文档 http://cn2.php.net/manual/zh/oci8.installation.php
编译php的时候要加上这个参数–with-oci8,但是加这个参数有个前提,就是必须要安装了对应的库文件。

安装库文件有两种方法:
一. 你的php环境和oracle在同一台服务器上(通常oracle都很大,这方法不合适)
二. 在你的php服务器上安装 Oracle Instant Client libraries.(这个方法适合php与oracle不在一个服务器上)

Oracle Instant Client libraries的安装步骤:详见 这里
1. 针对自己的系统下载适合的Instant Client packages安装包。其中安装包都需要Basic或者Basic Lite包(根据本链接选择一个系统平台,然后进去下载对应的Basic或者SDK等等包)
这里我下载了三个zip的包,分别是:
Instant Client Package – Basic
Instant Client Package – SQL*Plus
Instant Client Package – SDK

2. 解压包到一个单独的目录,比如 “instantclient”.(我把上述三个包放到一起,然后放到了/usr/local/instantclient)

3. 在环境变量里设置库的加载路径,路径为第二部设置的路径”instantclient”。多数UNIX平台环境变量设置LD_LIBRARY_PATH,而Windows系统应该用PATH

4. 可以开始你的应用了

加载库(上述第3步骤,环境变量)
上述所述的库,需要加载到linux系统才可以,那怎么加载呢
方法一:
编辑 /etc/ld.so.conf,在里面加入一行库文件路径/usr/local/instantclient(根据实际情况而定)
注意:centos的/etc/ld.so.conf文件里是用include包含加载了/etc/ld.so.conf.d/*.conf所有文件,所以我们可以创建一个文件/etc/ld.so.conf.d/oracle.conf,在里面加入一行库文件路径/usr/local/instantclient(根据实际情况而定),而不是直接编辑/etc/ld.so.conf文件。

方法二:
设置Linux系统设置环境变量

vim ~/.bashrc

最后一行加入

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/instantclient

此处根据实际情况修改,因为上述第二步的instantclient位置放到了/usr/local/instantclient

编译PHP
如果是编译安装php则需要加上 –with-oci8参数,因为我把Instant Client packages放在了/usr/local/instantclient
所以–with-oci8参数可以这样写
–with-oci8=shared,instantclient,/usr/local/instantclient
php实例编译如下:

./configure --prefix=/usr/local/php-5.3 --with-config-file-path=/usr/local/php-5.3/etc --with-config-file-scan-dir=/usr/local/php-5.3/etc/php.d --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --with-openssl --enable-soap --enable-safe-mode --enable-zip --with-oci8=shared,instantclient,/usr/local/instantclient

php官方实例,这样写的./configure –with-oci8=shared,instantclient,/usr/lib/oracle//client/lib
编译时如提示找不到libclntsh.so,可以加个软链

ln -s /usr/local/instantclient/libclntsh.so.12.1 /usr/local/instantclient/libclntsh.so

安装oci8拓展
使用php的pecl安装拓展

./pecl install oci8
在提示输入,Instant Client packages库的路径时候录入实际路径,此处录入:

shared,instantclient,/usr/local/instantclient

 

[root@localhost bin]# ./pecl install oci8
downloading oci8-2.0.8.tgz ...
Starting to download oci8-2.0.8.tgz (190,854 bytes)
.........................................done: 190,854 bytes
11 source files, building
WARNING: php_bin /usr/local/php-5.3/bin/php appears to have a suffix -5.3/bin/php, but config variable php_suffix does not match
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] : shared,instantclient,/usr/local/instantclient

最后把oci8加入php.ini

extension=oci8.so

查看phpinfo
F308B13D-63F7-4AF1-8967-D81978643B67