我們與PHP的距離(二): 任性的大小寫

本系列專為從PHP之外的語言開啟碼農人生、卻因命運安排整天與PHP為伍的人撰寫,收集一些從其他語言的角度看來不可思議的設計。如果能讓在讀這篇文章的你在實務上踩到而懷疑人生前就釋懷,就是我莫大的榮幸。

前言

前篇gethostbyname(),本篇討論少見於PHP之外的設計:varying case sensitivity,也就是某些情況下大小寫相關,某些情況下大小寫無關。總之,就是任性。

可能因為我個人有經年累月的大小寫相關的程式編寫習慣,再加上linter層層把關,我大概兩年多才發現有這個特性,當下簡直是晴天霹靂、茅廁頓開,在這非黑即白的大小寫相關性世界,PHP竟仍能為我們開一扇窗;彷彿在提醒我們,看待世間萬物切勿抱持成見,才能看見真實。

常有人說PHP是如詩般的語言,這,何嘗不正是其獨有的詩意呢?

嘴夠了,進入正題

更精確來講,PHP的大小寫相關性是:

  • 函式名、命名空間名與類別名大小寫無關
  • 變數名、常數名大小寫相關

啊啊啊啊啊啊啊啊啊啊啊啊啊

大部分的時候這都只會造成一些小驚喜,像這樣:

class Foo {
    const ABC = 'I am a constant';
    static function bar() { ... }
}
$poetry = 'I am a variable';

Foo::bar();  // 可以
foo::Bar();  // 嗯,有何不可
print_r( $poEtry ); // 不行喔
print_r( Foo::aBC ); // 討厭,就說不行了,都欺負人家 ...

但一個沒站穩,玻璃心還是會摔碎的。

繼續閱讀 “我們與PHP的距離(二): 任性的大小寫"

我們與PHP的距離(一): gethostbyname()

前言

自從加入a8c,PHP作為常備語言之一,時至今日仍然像顆出奇蛋一樣止不盡的驚喜。天底下沒有完美的語言,但至今確實沒有任何一個我寫過的程式語言比PHP讓我感到更『魔幻』。本系列專為從PHP之外的語言開啟碼農人生、卻因命運安排整天與PHP為伍的人撰寫,收集一些從其他語言的角度看來不可思議的設計。如果能讓在讀這篇文章的你在實務上踩到而懷疑人生前就釋懷,莫大的榮幸。

祝各位天天PHP,天天開心。

進入正題

首先來看看今天的主角:gethostbyname() 在文件中是怎麼描述的吧:

gethostbyname ( string $hostname ) : string

Returns the IPv4 address of the Internet host specified by hostname.

舉例來說:

php> print_r( gethostbyname( 'softman.blog' ) );
192.0.78.25
php> print_r( gethostbyname( 'localhost' ) );
127.0.0.1

很簡單吧。這基本上就是一個gethostbyname()系統函式的包裝,

但問題出在它的回傳值設計。根據官方文件:

Returns the IPv4 address or a string containing the unmodified hostname on failure.

『當錯誤發生時,會回傳無修改的hostname引數』

……………..

這神設計有兩個問題。第一,和許多PHP函式的錯誤行為相悖;第二,複雜的錯誤處理讓這個函式很難正確使用。如果你認為:

$hostname === gethostbyname( $hostname )

這樣就結了,那就太小看PHP惹 …

繼續閱讀 “我們與PHP的距離(一): gethostbyname()"