PHP5.3.3では以下のような「後方非互換の変更」が加えられています。
Methods with the same name as the last element of a namespaced class name will no longer be treated as constructor. This change doesn’t affect non-namespaced classes.
<?php
namespace Foo;
class Bar {
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method in PHP 5.3.3
}
}
?>
There is no impact on migration from 5.2.x because namespaces were only introduced in PHP 5.3.
PHP 5.3.3 Released!
どういう事かというと、
<?php
class A
{
function A()
{
echo __CLASS__;
}
}
class B extends A
{
}
class C extends B
{
function C()
{
parent::B();
}
}
new C();
結果
PHP5.3.2
PHP Fatal error: Call to undefined method B::B()
PHP5.3.3
A
PHP5.3.xによってPHP4に対する後方互換が崩れたんですが、PHP5.3.3でPHP5.3.x非互換となる代わりにPHP4後方互換が一部戻ったという話。
PEAR::Image_Graphで問題でてました。
PHP5の環境なら以下のように書くので問題は起こらないんですけどね。
<?php
class A
{
public function __construct()
{
echo __CLASS__;
}
}
class B extends A
{
}
class C extends B
{
public function __construct()
{
parent::__construct();
}
}
new C();
Services_Twitter_r302262.diff
7904 byte
[md5] 89930ad5cf340af7a101ed74261d4a34
修正
sendOAuthRequest()メソッドでHTTP_OAuth_Exceptionがthrowされる問題
serchメソッドでhttp://search.twitter.comを利用しない問題
blocks/createメソッドでuser_id、screen_nameを指定できない問題
blocks/destroyメソッドでuser_id、screen_nameを指定できない問題
テストでOAuthの場合sourceはアプリケーションになる問題
テストでutf8テストが二重投稿になる問題
テストでOAuthの場合オブジェクトがHTTP_OAuth_Consumer_Responseになる問題
追加
blocks/bloking/idsメソッド (call $t->blocks->blocking_ids())
$ svn export -r 302262 http://svn.php.net/repository/pear/packages/Services_Twitter/trunk Services_Twitter
$ wget http://blog.cheki.net/Services_Twitter_r302262.diff
$ cd Services_Twitter
$ patch -p0 < ../services_twitter.diff
patching file Services/Twitter.php
patching file data/api.xml
patching file tests/900-exceptions.phpt
patching file tests/910-options.phpt
patching file tests/920-utf8.phpt
patching file tests/data/utf8-2.dat
patching file tests/setup.php
Services_Twitter
以前パッチが取り込まれたけど、Basic認証でしか確認してなくて、OAuthだとDELETEメソッドで問題がでてました。
その他なんか迷走してる感じだったので、パッチ送りたいなとPEARアカウントを取得しようと申請したのですがレスポンスがないので、とりあえずgithubにぶち込んだ次第です。
バグレポートもパッチ投げるにもPEARアカウントないと半匿名な感じになるので。
cockok's Services_Twitter at master – GitHub
リリース最新は0.6.2ですが、trunkが変更されてたのでそちらをfork。
あいきゃんとすぴーくいんぐりっしゅ。
もちろん書くのも。
ちなみに、DELETEメソッドででる問題は、RFC2616に以下のようなところ。
The DELETE method requests that the origin server delete the resource identified by the Request-URI.
HTTP/1.1: Method Definitions
こっちはPEAR::HTTP_OAuthの問題。
Manual :: 共有ホストでの PEAR のローカルコピーのインストール
既にpearコマンドが利用可能な場合。
$ pear config-create /path/to ~/.pearrc
/path/to/pear以下に諸々配置される設定ファイルが~/.pearrcとして作成される。
この場合、PEARディレクトリは/path/to/pear/phpとなる。
ディレクトリ等、設定をを変更したい場合は、通常通りpear config-setコマンドで。
phpコマンドを実行する際にinclude_pathの設定をしたいが、オプションでは指定できないので、php.iniを別途準備し読むように指定するaliasを設定。
$ cp /etc/php.ini /path/to
$ vim /path/to/php.ini
$ alias php='php -c /path/to/php.ini'
php.iniのinclude_pathの設定は以下のようにローカルのPEARディレクトリしか読み込まない、または、優先的に読み込むように設定。
include_path = ".:/path/to/php"
#include_path = ".:/path/to/php:/usr/share/pear:/usr/share/php"
まさに誰得。
ブラウザベースは情報いっぱいあったんだけど、クライアントベースが見つからなかったので。
取得したaccess_token、access_token_secretを利用の仕方は下記で。
PEAR::HTTP_OAuthでxAuth – ぱんぴーまっしぐら
#!/usr/bin/env php
<?php
require_once 'HTTP/OAuth/Consumer.php';
define('CONSUMER_KEY', 'xxxxxxxxxxxxxxxxxxxx');
define('CONSUMER_SECRET', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
try {
$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request();
$consumer_request->accept($http_request);
$consumer = new HTTP_OAuth_Consumer(CONSUMER_KEY, CONSUMER_SECRET);
$consumer->accept($consumer_request);
$consumer->getRequestToken('http://twitter.com/oauth/request_token');
$url = $consumer->getAuthorizeUrl('http://twitter.com/oauth/authorize');
if (!$stdin = fopen('php://stdin', 'r')) {
throw new Exception('stdin open failed');
}
echo 'Visit the following URL in your browser to authenticate twitter: ';
echo $url."\n";
echo 'Enter Twitter OAuth PIN: ';
$pin = trim(fgets($stdin, 64));
$consumer->getAccessToken('http://twitter.com/oauth/access_token', $pin);
echo 'access_token: '.$consumer->getToken()."\n";
echo 'access_token_secret: '.$consumer->getTokenSecret()."\n";
} catch (Exception $e) {
echo $e->getMessage().' in '.$e->getFile().' line '.$e->getLine()."\n";
exit(1);
}
Manual :: コードの提供にあたっての要求事項
インストール
# yum --enablerepo=remi,epel install php-pear-PHP-CodeSniffer
使い方
$ phpcs hoge.php
Services_Twitter::sendOAuthRequestではHTTP_Request2_Exceptionをcatchしていますが、実際はHTTP_OAuth_Exceptionをcatchしなきゃいけない。
Services_Twitterはベーシック認証周りは大丈夫だと思いますが、OAuth周りはまともにテストされてないので、結構バグあります。
services_twitterのprepareRequestメソッド
続きを読む…
パッチ
services_twitter.diff
13828 byte
[md5] cfbc090a25f68b8f0ea52a281aeccbe7
パッチ(テスト部分)
services_twitter_test.diff
119284 byte
[md5] e238637ffc8953b2e6bb5249b20e8c48
一括
Services_Twitter.tar.gz
59834 byte
[md5]145d9e35e4000e7700e228f1f59a4e6a
追加メソッド一覧
Methods Documentatation name tests
----------------------- --------------------------- ---------------------------------------
trends/available 840-trends-available.phpt
trends/location 850-trends-location.phpt
lists/create POST lists (create) 153-lists-create-delete.phpt
lists/update POST lists id (update) 151-lists-update.phpt
lists/list GET lists (index) 150-lists-list.phpt
lists/show GET list id (show) 152-lists-show.phpt
lists/delete DELETE list id (destroy) 153-lists-create-delete.phpt
lists/statuses GET list statuses 160-lists-statuses.phpt
lists/memberships GET list memberships 161-lists-memberships.phpt
lists/subscriptions GET list subscriptions 162-lists-subscriptions.phpt
list_members/list GET list members 181-list_members-list.phpt
list_members/create POST list members 180-list_members-create-delete.phpt
list_members/delete DELETE list members 180-list_members-create-delete.phpt
list_members/show GET list members id 182-list_members-show.phpt
list_subscribers/list GET list subscribers 191-list_subscribers-list.phpt
list_subscribers/create POST list subscribers 190-list_subscribers-create-delete.phpt
list_subscribers/delete DELETE list subscribers 190-list_subscribers-create-delete.phpt
list_subscribers/show GET list subscribers id 192-list_subscribers-show.phpt
パッチは現段階での最新である295629に当ててください。
$ svn export -r 295629 http://svn.php.net/repository/pear/packages/Services_Twitter/trunk Services_Twitter
$ wget http://blog.cheki.net/services_twitter.diff
$ cd Services_Twitter
$ patch -p0 < ../services_twitter.diff
patching file Services/Twitter.php
patching file data/api.xml
patching file data/api.rng
テスト部へのパッチが必要な場合は別途
$ patch -p0 < ../services_twitter_test.diff
patching file tests/181-list_members-list.phpt
patching file tests/192-list_subscribers-show.phpt
patching file tests/tests-config.php.example
patching file tests/151-lists-update.phpt
patching file tests/data/list_subscribers/list.dat
patching file tests/data/list_subscribers/show.dat
patching file tests/data/list_subscribers/delete.dat
patching file tests/data/list_subscribers/create.dat
patching file tests/data/list_members/list.dat
patching file tests/data/list_members/show.dat
patching file tests/data/list_members/delete.dat
patching file tests/data/list_members/create.dat
patching file tests/data/lists/statuses.dat
patching file tests/data/lists/list.dat
patching file tests/data/lists/memberships.dat
patching file tests/data/lists/show.dat
patching file tests/data/lists/update.dat
patching file tests/data/lists/delete.dat
patching file tests/data/lists/create.dat
patching file tests/data/lists/subscriptions.dat
patching file tests/data/trends/location.dat
patching file tests/data/trends/available.dat
patching file tests/191-list_subscribers-list.phpt
patching file tests/153-lists-create-delete.phpt
patching file tests/162-lists-subscriptions.phpt
patching file tests/150-lists-list.phpt
patching file tests/160-lists-statuses.phpt
patching file tests/182-list_members-show.phpt
patching file tests/setup.php
patching file tests/161-lists-memberships.phpt
patching file tests/850-trends-location.phpt
patching file tests/152-lists-show.phpt
patching file tests/840-trends-available.phpt
patching file tests/190-list_subscribers-create-delete.phpt
テスト
$ php tests/AllTests.php
PHPUnit 3.4.11 by Sebastian Bergmann.
..................................................
Time: 4 seconds, Memory: 9.75Mb
OK (50 tests, 0 assertions)
tests-config.phpセット後。
$ php tests/AllTests.php
PHPUnit 3.4.11 by Sebastian Bergmann.
..........S....F.......S.....S..........S.....F.S.
Time: 48 seconds, Memory: 10.00Mb
There were 2 failures:
1) /home/cockok/projects/Services_Twitter/tests/460-account-update_profile_image.phpt
--- Expected
+++ Actual
@@ @@
-bool(true)
+bool(false)
/home/cockok/projects/Services_Twitter/tests/AllTests.php:56
/home/cockok/projects/Services_Twitter/tests/AllTests.php:72
2) /home/cockok/projects/Services_Twitter/tests/470-account-update_profile_background_image.phpt
--- Expected
+++ Actual
@@ @@
-bool(true)
+あなたが設定した背景用の画像に問題があるようです。おそらく大きすぎです。 (code: 403, call: http://api.twitter.com/1/account/update_profile_background_image.json)
/home/cockok/projects/Services_Twitter/tests/AllTests.php:56
/home/cockok/projects/Services_Twitter/tests/AllTests.php:72
FAILURES!
Tests: 50, Assertions: 0, Failures: 2, Skipped: 5.
画像周りでエラーでてるけどもともと出てるようなので知りません。
PHPでtwitterを利用する場合にはServices_Twitterが便利です。
このServices_Twitterですが、公式のPEAR公式と野良(?)版が存在します。
- PEAR公式 Services_Twitter
- 悠希@arielaさん版 Services_Twitter
最新版はCodeRepos /lang/php/Services_Twitter – CodeRepos::Share – Trac
- openpear版 Services_Twitter – Openpear
openpear版はさっき見つけたけど、ちょっと使う気になれないので選択肢としてはPEAR公式か悠希さん版。
環境がCentOS5系、PHP5.1系だったので、悠希さん版を検討したのですが、CodeReposに入れられてるもののほとんど更新されておらず、APIが増えてる現状を考えると作業量的に厳しいということでPEAR公式を利用することに。
Services_Twitter-0.1.0 betaがリリースされたので日本のと比較してみた – 肉とご飯と甘いもの @ sotarok
この頃と状況は結構変わっていて、json必須ではない(でも速度の関係でpeclのjsonを利用)、HTTP_Request2でsocket通信とかになっています。
結構珍しい造りになっていて、api群はdata/api.xmlで管理されています。
pearコマンドを利用せずに利用する人は注意が必要。