Archive for the ‘Coding’ Category

SimpleXML真是个好东西

这两天写一个页面需要访问一个RSS并且读取rss内的的文章标题和文章的链接,就尝试了一下PHP5的新特性也就是这个SimpleXML,直接支持xpath获取,确实很方便啊 :

$file = file_get_contents("__YOUR__RSS__URL__HERE__");
 
$xml = new SimpleXMLElement($file);
 
$titles = $xml -> xpath("/rss/channel/item/title");
$links = $xml -> xpath("/rss/channel/item/link");

然后就对$titles和$links这两个数组进行操作即可。

利用__FILE__魔术常量来组织PHP项目文件

PHP中并没有明确的Application(或者与此类似)的概念,因此文件分类如果较多又有许多代码共用,在不使用框架的情况下,就比较难以组织,不得不说这是PHP的一个缺陷。最近在项目中就碰到了这个问题。有前台的页面和后台的页面,后台页面放在admin目录。前后台都有一定量的公用的代码,并且其中也包含了可以复用的函数,比如说输出出错信息,验证登录等等等的。我最初的方法是折中的在应用的根目录下面放一个includes目录,然后再在admin里面也放置一个同样的includes,两边的内容基本上是大同小异的。可以说实在谈不上优雅的解决方案。
后来想到了wordpress也是类似的结构,稍微看了一下代码,发现它有一个全局的wp-config.php文件,里面有如下行:

define('ABSPATH', dirname(__FILE__).'/');
require_once(ABSPATH.'wp-settings.php');

查了一下手册,发现__FILE__是PHP提供的一个魔术常量,永远返回PHP解析到它时的文件的绝对路径(似乎从这个角度来看应该是变量?),利用它可以很好的定位项目的绝对路径,也为进一步的项目中的其它目录提供一个基准,例如我目前的config.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/*
 * 配置文件
 */
 
//常量PATH_INC - /includes绝对路径
define("PATH_INC", dirname(__FILE__) . '/');
 
//常量PATH_APP - /路径
define("PATH_APP", PATH_INC . "../");
 
//常量PATH_LIB - /lib路径
define("PATH_LIB", PATH_INC . "../lib");
 
//常量PATH_ADMIN - /admin路径
define("PATH_ADMIN", PATH_INC . "../admin");
 
//数据库设置
define("DB_HOST", "YOUR_DATABASE_HOST");
define("DB_USER", "YOUR_DATABASE_USER");
define("DB_PASSWORD", "YOUR_DATABASE_PASSWORD");
define("DB_DBNAME", "YOUR_DATABASE_NAME");
 
?>

如此一来只要在任何这个项目的php文件中用相对路径包含这个config.php,再用如下方法include所需要的文件即可:

//载入配置文件
require_once 'includes/config.php';
 
//建立数据库连接
require_once PATH_INC . "conn.php";

Zend_DB访问MySQL时使用UTF-8编码的问题

最近要在项目中使用Zend_DB作为数据库访问层,虽然方便,不过发现其对UTF-8无法默认就能很好的支持(不过其实更可能是因为mysql默认输出不是utf-8而导致这个问题)
大概的解决方法就是这样:

$db->query("set names utf8")

显然,这样显得不够优雅(也可以说是心理问题 -_-b),每次都必须要手动的进行一次query。
于是更好的方案其实也就是让这个查询成为PDO的初始化查询,方法如下:

1
2
3
4
5
6
7
8
9
10
11
$db=Zend_Db::factory('PDO_MYSQL',
	array(
		'host'           => 'localhost',
		'username'       => 'your_username',
		'password'       => 'your_password',
		'dbname'         => 'your_database',
		'driver_options' => array(
			PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8'
		)
	)
);

还有一个方法也很好,就是重写Zend_Db的factory方法:

1
2
3
4
5
6
7
8
9
10
class My_Db extends Zend_Db
{
   static public function factory($adapterName, $config = array())
   {
      $adapter = parent::factory($adapterName, $config);
      $adapter->query('set names utf8');
 
      return $adapter;
   }
}

以后就可以通过My_Db的factory方法来创建数据库连接了。
另外还有一个方法,就是也可以修改Zend_Db的Zend_Db_Adapter_Pdo_Abstract(位于Zend/Db/Adaptor/Pdo/abstract.php)的_connect方法,在里面添加:

$this->query("set names utf8")

不过这样影响到移植性,所以不推荐……

利用CSS的Border属性来创造三角形

guu同学昨日问起是否有实现斜线的CSS样式,当时答曰没有——或者说,IE上没有,支持绘图的Canvas元素是HTML5的东西,还没有在IE中得到支持。
今天突然想起这个问题想到可以利用border形成的那条中间线来模拟这种效果,虽称不上完美,但也似乎是个可以变通的方法。当然,局限性也很大,比如不可能自由旋转,边必须是上下左右的某个固定的方向,不能在div里面放文字。

那么效果可以点击这里

Read the rest of this entry >>

LightWindow

lightwindow
最近忙里偷闲的在看《软件观念革命:交互设计精髓》(豆瓣链接),想起自己很久前用Javascript和DOM写的一个虚拟窗口……特性如下:

  • “虚拟桌面”——可以创建多个虚拟窗口组,而他们之间相互独立(如上图)
  • 更换皮肤支持
  • 半透明渐变支持
  • 内建自适应滚动条支持(不算完美)
  • 主流浏览器支持——Firefox 1.5+, Opera 9+, Internet Explorer 6.0+

在线演示地址

Read the rest of this entry >>

PHP5的OOP中的魔术方法

翻阅一些计算机中的旧的文档时,在看What’s New in PHP5时看到的,发现一些PHP5的OOP的一些很有趣的特性,主要是以下方法:

  • __toString()
  • __call()
  • __get()
  • __set()

就当是做一个记录吧

Read the rest of this entry >>

测试WP-Syntax

语法加亮插件装载……

1
2
3
4
<?php
    $text = "hello, world";
    echo $text; //测试语法加亮
?>
1
2
3
4
window.onload = function(){
    var x = ["hello"," world"];
    window.alert(x.join());
}
1
2
3
4
5
public class test{
    public static final void main(String[] arg){
        System.out.println("hello, world");
    }
}
Page 4 of 41234