<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Link4 &#8211; Larry的午茶時光</title>
	<atom:link href="https://blog.yuyansoftware.com.tw/tag/link4/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.yuyansoftware.com.tw</link>
	<description></description>
	<lastBuildDate>Mon, 14 Apr 2025 04:10:47 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.yuyansoftware.com.tw/wp-content/uploads/2022/10/favicon-45x45.png</url>
	<title>Link4 &#8211; Larry的午茶時光</title>
	<link>https://blog.yuyansoftware.com.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PHP 8 的新功能與優化：Named arguments，Constructor property promotion，Nullsafe operator，Just-In-Time (JIT) compilation</title>
		<link>https://blog.yuyansoftware.com.tw/2021/09/php-8-features-optimizations/</link>
		
		<dc:creator><![CDATA[Larry]]></dc:creator>
		<pubDate>Sat, 18 Sep 2021 07:14:19 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Link4]]></category>
		<category><![CDATA[PHP 8]]></category>
		<guid isPermaLink="false">https://blog.yuyansoftware.com.tw/?p=8499</guid>

					<description><![CDATA[PHP 8 推出了一些新功能與優化，修正了 PHP 語言長期的字串 / 數字比較問題，推出了 Just-In-Time (JIT) compilation，加快執行效率。]]></description>
										<content:encoded><![CDATA[
<p>PHP 8 正式版在去年 (2020年) 11月釋出，PHP 7 的最後一個版本就是 PHP 7.4 了。PHP 8 推出了一些新功能、新寫法，修正了 PHP 語言長期的字串 / 數字比較問題，推出了 Just-In-Time (JIT) compilation，加快執行效率。本篇文章就照著官方文件的順序，來走一遍 PHP 8.0 的新功能。</p>



<p><a href="https://www.php.net/releases/8.0/en.php" target="_blank" rel="noreferrer noopener">https://www.php.net/releases/8.0/en.php</a></p>



<h4 class="wp-block-heading">Named Arguments 命名參數</h4>



<p>舉例來講，<code><span class="has-inline-color has-vivid-cyan-blue-color">function htmlspecialchars</span></code> 的 prototype</p>



<pre class="wp-block-code"><code>function htmlspecialchars(
    string $string,
    int $flags = ENT_COMPAT,
    string $encoding = null,
    bool $double_encode = true
)</code></pre>



<p>如果只是要指定其中一個參數 <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">double_encode</mark></code>，其他用預設值，PHP 8 可以這樣寫</p>



<pre class="wp-block-code"><code>htmlspecialchars($string, double_encode: false);</code></pre>



<p>注意 <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">flags</mark></code>, <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">encoding</mark></code> 都不用輸入。官方文件並提到，使用 Named Arguments 時參數<strong>不需要依照順序</strong>。</p>



<p>另外，如上方範例，Named Arguments 可以跟傳統輸入參數的方式混用。可以混用又沒有參數輸入的順序限制，會不會造成 ambiguous。如果用 coding convention 去限制，又會造成開發上的成本。larry 個人是對這個新功能持保留態度。</p>



<h4 class="wp-block-heading">Constructor property promotion</h4>



<p>在 PHP 8，constructor arguments 可以直接宣告成 class 的屬性。如下範例，注意 constructor arguments 前直接加了 public modifier。</p>



<pre class="wp-block-code"><code>class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}</code></pre>



<p>這樣 x, y, z 就直接宣告成 class 的屬性，不需要另外宣告</p>



<pre class="wp-block-code"><code>class Point {
  // 不需要
  public float $x;
  public float $y;
  public float $z;
  ...
}</code></pre>



<p>這樣的確簡化了很多程式碼，但少了明文定義 class 的屬性。這樣真的不會造成混淆嗎？而且一樣，如果用 coding convention 去限制，又會造成開發上的成本。對這個新功能我還是持保留態度。</p>



<h4 class="wp-block-heading">Match expression (match 表達式)</h4>



<pre class="wp-block-code"><code>echo match (8.0) {
  '8.0' =&gt; "Oh no!",
  8.0 =&gt; "This is what I expected",
};
// print “This is what I expected”</code></pre>



<p><code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">match</mark></code> 表達式是 PHP 8 新出的。與 <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">switch</mark></code> 判斷式比較，<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">match</mark></code> 表達式會直接 return 數值，並用 strict comparison 做輸入/選項比較。相對的，<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">switch</mark></code> 判斷式是 loose comparison。所以如果用 <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">switch</mark></code>，輸入 8.0，會先找到字串的 &#8216;8.0&#8217;。</p>



<p>寫法跟應用上 larry 還是不太習慣。<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">match</mark></code> 大括號裡的東西比較像 array 的寫法，卻用大括號包住。應用上也有點 array 的味道，那直接使用 array 相關 function 反而還清楚一點。</p>



<h4 class="wp-block-heading">Nullsafe operator</h4>



<pre class="wp-block-code"><code>$country = $session?-&gt;user?-&gt;getAddress()?-&gt;country;</code></pre>



<p>如果 <code><span class="has-inline-color has-vivid-cyan-blue-color">$session</span></code> 有值，return <code><span class="has-inline-color has-vivid-cyan-blue-color">$session-&gt;user</span></code>。如果 <code><span class="has-inline-color has-vivid-cyan-blue-color">$session-&gt;user</span></code> 有值，return <code><span class="has-inline-color has-vivid-cyan-blue-color">$session-&gt;user-&gt;getAddress()</span></code>，依此類推。從左到右，每一個問號會評估一次是否為 null，如果不為 null，繼續往右走。如果為 null，中斷在為 null 的部分，並 return null。</p>



<p>讀者可以評估一下上面 sample code，如果以 if else 來寫，或以三元運算子來寫，會有多少程式碼。用 nullsafe operator 除了簡潔以外，語意上也清楚。這個新功能 larry 會考慮使用。</p>



<h4 class="wp-block-heading">Saner string to number comparisons 較健康的字串 / 數字比較</h4>



<pre class="wp-block-code"><code>0 == 'foobar';
// PHP 7 和 PHP 7 以前會 return true
// PHP 8 會 return false</code></pre>



<p>在 PHP 7 和 PHP 7 以前，上面 sample code 比較的方式是字串 &#8220;foobar&#8221; 先嘗試 cast 成數字，發現沒辦法 cast，所以 cast 成 0，所以上面比較式 return true。</p>



<p>這部分是 PHP 語言長期的一個缺陷，尤其當使用 <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">in_array</mark></code>, <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">switch</mark></code> 等包含 implicit comparison 時，最好自己先判斷會不會有字串 / 數字比較的情況，不然 <meta charset="utf-8"></meta>implicit comparison 判斷可能有誤。</p>



<p>PHP 8 修正了這個錯誤，除了將字串 cast 成數字外，也會將要比較的數字 cast 成字串，字串對字串比較。也就是比之前多了一個比較條件。</p>



<h4 class="wp-block-heading">Just-In-Time (JIT) compilation</h4>



<p>PHP 是直譯式語言 (interpreted language)，要先裝好 PHP 套件，執行時 PHP code 會在 PHP 套件的環境裡，也可以說是透過 PHP 套件，不用編譯，直接執行。</p>



<p>PHP 8 推出的 <strong>Just-In-Time</strong> (JIT) compilation，會在執行期間，自動將某些 code 編譯，主要是 JIT 引擎分析會頻繁執行的 code<meta charset="utf-8">，進行編譯，以達成效能的最大化。</p>



<p>原本 PHP 要透過一個 Zend virtual machine 與 CPU 溝通。有了 JIT compiler，部分程式碼會被編譯，快取在記憶體裡。<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">當第二次執行該段 code，又編譯碼的快取還在的話，就會繞過 Zend virtual machine，直接執行<meta charset="utf-8">編譯碼與 CPU 溝通。</mark></p>



<p>PHP 8 的 JIT compiler 有兩種：Tracing JIT 與 Function JIT。</p>



<p><strong>Function JIT</strong> 會編譯整個 PHP functions，但不會去分析程式碼結構。<strong>Tracing JIT</strong> 則會去找到這些重複又頻繁執行的 code，進行編譯。<meta charset="utf-8">Tracing JIT 因為編譯的總量少，能加快編譯的速度 (節省主機資源)，並在有限的記憶體 buffer，可以快取對整體效能最有幫助的編譯碼。</p>



<h4 class="wp-block-heading">結論</h4>



<p>PHP 8 大部份新寫法類型的功能，larry 是持保留態度，感覺對開發上沒有實質的幫助。PHP 8 修正了 PHP 語言長期的字串 / 數字比較問題，這件事需要知道一下。JIT 的部分也要知道，如果使用 PHP 8，<meta charset="utf-8">JIT 的部分一定要正確 configure，開啟使用。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP Autoload</title>
		<link>https://blog.yuyansoftware.com.tw/2016/12/php-autoload/</link>
		
		<dc:creator><![CDATA[Larry]]></dc:creator>
		<pubDate>Fri, 09 Dec 2016 15:08:00 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Link4]]></category>
		<guid isPermaLink="false">http://test234.yuyansoftware.com.tw/2016/12/09/php-autoload/</guid>

					<description><![CDATA[有一些文章會把 namespace 與 autoload 擺在一起講，這點要釐清。namespace 與 autoload 觀念上是沒有關係的，即使你一個一個 class 去 include / require 也可以用 namespace。]]></description>
										<content:encoded><![CDATA[<p><span style="font-size: large;">__autoload</span><br />
<a href="http://php.net/manual/en/function.autoload.php" target="_blank" rel="noopener noreferrer"><span style="font-size: large;">http://php.net/manual/en/function.autoload.php</span></a><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">當你 new 一個物件時</span></p>
<pre>$obj = new myClass1();
</pre>
<p><span style="font-size: large;">__autoload function 會被觸發，class name 會被當作參數傳入。</span><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">在 new 其他 class 的物件時，</span></p>
<pre>$obj = new myClass2();
</pre>
<p><span style="font-size: large;">__autoload 也會被觸發，所以你的 include / require 可以寫在 __autoload function 裡。</span><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">__autoload 有一個特別「沒」彈性的地方：一個 file scope 裡面不可以有兩個 __autoload，不然會 error。在你使用多個框架、plugin 混用時，如果每個框架、plugin 都用 __autoload，可以想像幾乎是沒辦法使用。</span><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">後來出現了 spl_autoload_register 來取代 __autoload (spl 為 standard php library 的縮寫)</span><br />
<a href="http://php.net/manual/en/function.spl-autoload-register.php" target="_blank" rel="noopener noreferrer"><span style="font-size: large;">http://php.net/manual/en/function.spl-autoload-register.php</span></a><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">spl_autoload_register 可以註冊多個 callback function， 你的 include / require 就寫在這些 callback function 裡。 當 new 一個物件時，php 執行環境會依序觸發這些 callback function，直到找到該物件的 class 為止。</span><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">有一些文章會把 namespace 與 autoload 擺在一起講，這點要釐清。namespace 與 autoload 觀念上是沒有關係的，即使你一個一個 class 去 include / require 也可以用 namespace。但幾乎所有現代框架有用 namespace 的，自己也要帶 autoload function 去對應自己的程式碼檔案結構。</span><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">PSR-4 有提供 autoload function sample code</span><br />
<a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md" target="_blank" rel="noopener noreferrer"><span style="font-size: large;">https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md</span></a><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">但目前大概很少機會需要自己寫這些 autoloader。</span><br />
<span style="font-size: large;"><br />
</span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[線下活動] PHPConf Taiwan 2016</title>
		<link>https://blog.yuyansoftware.com.tw/2016/10/phpconf-taiwan-2016/</link>
		
		<dc:creator><![CDATA[Larry]]></dc:creator>
		<pubDate>Sun, 30 Oct 2016 04:11:00 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[實體活動]]></category>
		<category><![CDATA[Link4]]></category>
		<guid isPermaLink="false">http://test234.yuyansoftware.com.tw/2016/10/30/%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-phpconf-taiwan-2016/</guid>

					<description><![CDATA[有位朋友介紹我去聽 PHPConf，我看了議程之後也覺得不錯，於是我票一開始賣就馬上買了第一天 (10/29) &#8230; ]]></description>
										<content:encoded><![CDATA[<p><span style="font-size: large;">有位朋友介紹我去聽 </span><span style="font-size: large;"><a href="http://2016.phpconf.tw/" target="_blank" rel="noopener noreferrer">PHPConf</a>，</span><span style="font-size: large;">我看了議程之後也覺得不錯，於是我票一開始賣就馬上買了第一天 (10/29) 的票。第一天上午的講者是&nbsp;Josh Lockhart (Modern PHP 的作者) 和&nbsp;Sebastian Bergmann (PHPUnit 的作者)。</span></p>
<div style="text-align: center;"><span style="font-size: large;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Josh Lockhart&nbsp;</span></div>
<div style="text-align: center;"><span style="font-size: large;">(很多朋友都知道我手機不太好，畫面就多包涵了)</span></div>
<div style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://3.bp.blogspot.com/-CcZwvL37ROM/WBSydJtRxhI/AAAAAAAAAF0/_uHsDDaeEhEOtl8zBurN9LxwIFLileeZgCLcB/s1600/IMAG0330.jpg"><img fetchpriority="high" decoding="async" src="https://3.bp.blogspot.com/-CcZwvL37ROM/WBSydJtRxhI/AAAAAAAAAF0/_uHsDDaeEhEOtl8zBurN9LxwIFLileeZgCLcB/s400/IMAG0330.jpg" width="400" height="222" border="0"></a></div>
<p><span style="font-size: large;">Josh 的題目是 More Than Code, 他剛開始就說今天不講 PHP, 而是用更大的 picture 來說明何謂 「Senior 」developer. 下面是他的大綱 slide (因為每一點是 popup 出來的，沒拍到第五點，下面第五點是我 key 上去的)</span></p>
<div style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-pyu5QEnIbUM/WBS0ipSEZ4I/AAAAAAAAAGA/sRKcl5aPNOAs4VM72Qn4LvccTQa9EV22ACLcB/s1600/IMAG0331.jpg"><img decoding="async" src="https://1.bp.blogspot.com/-pyu5QEnIbUM/WBS0ipSEZ4I/AAAAAAAAAGA/sRKcl5aPNOAs4VM72Qn4LvccTQa9EV22ACLcB/s400/IMAG0331.jpg" width="400" height="223" border="0"></a></div>
<p><a name="more"></a><span style="font-size: large;">就如 larry 之前提到的，不管你程式碼寫得多麼漂亮，design pattern 用得多好，軟體工程做得多深，不想清楚這些「out of box」的東西，你的狀態就不會改變，你的官位/收入就不會改變。換句話說，我們是為了「解決問題」或「創造價值」而寫程式，而不是為了軟體工程而寫程式。</span><br><span style="font-size: large;"><br></span><span style="font-size: large;">第二位講者是 Sebastian Bergmann. 他主要是講 PHPUnit 和 PHP 近幾年版本變革。他有提到 PHP 5.6 active support 即將終止</span><br><a href="https://secure.php.net/supported-versions.php" target="_blank" rel="noopener noreferrer"><span style="font-size: large;">https://secure.php.net/supported-versions.php</span></a><br><span style="font-size: large;"><br></span><span style="font-size: large;">PHP 5.6 是 PHP5 的最後一個版本，也就是說，今年底之後 PHP5 就不會有 active support 了，這意味著各個公司、開發者，是該想想什麼時候要 migrate 到 PHP7 了。</span><br><span style="font-size: large;"><br></span><span style="font-size: large;">另外 PHPUnit 我會找時間研究一下，主要是希望藉由寫測試的方式，看能否 figure out 一些比較先進的 cowork 方式。</span><br><span style="font-size: large;"><br></span><span style="font-size: large;">下午的議程我聽了Miles的「使用 Slim 為 Legacy Code 重構」，閃亮亮的「Refactoring to Collections &#8211; 從陣列重構談物件導向程式設計」，大澤木小鐵的「用 Laravel + Vue.js 打造即時資訊看板」。本來是想報 workshop 的，Accupass 也有寄信通知 workshop 需要另外報名，但實在太忙了，想到要處理時已經沒有名額了。後來想想這樣也好，可以輕鬆一點。</span></p>
<p></p>


<h2 class="wp-block-heading">Miles的「使用 Slim 為 Legacy Code 重構」</h2>



<p>他講了一個自己歸納出的一個架構。在 browser 和 application 中間新增一個模塊，他稱之為 Proxy. 這個 Proxy 通常是小 framework, 例如 Slim。這個 Proxy 扮演 router 的角色，可以 config 成將 request 導向原本 application, 或是重構中的 application。同樣的，test server 發的 request 也可以導向原本 application, 或是重構中的 application。當重構中的 application 的某些模塊測試過了，可以 commit/push, 其他正在開發新 feature 的工程師可以立即 merge, 或是立即 rebase/merge.</p>



<p>他提到類似用 C++ define guard 的方式去切 Proxy 導向哪。不知道有 C++ 經驗的朋友有無聽/用過 define guard？用 define guard 去開關某些 code，例如正在開發的 code, 某個單一功能的 code。講到這個 larry 倒是滿懷念的，而且有一些 idea 浮出來，之後應該會應用到 PHP 上面。<br><br></p>



<h2 class="wp-block-heading">閃亮亮的「Refactoring to Collections &#8211; 從陣列重構談物件導向程式設計」</h2>



<p>利用 PHP 的 array_map, array_filter&#8230; 等，或是 Laravel 的 map, filter &#8230; 等去取代 for loop, 或是 nested for loop 處理 data array 的情況。<br><br></p>



<h2 class="wp-block-heading">大澤木小鐵的「用 Laravel + Vue.js 打造即時資訊看板」</h2>



<p>利用&nbsp;<a rel="noreferrer noopener" href="https://github.com/tlaverdure/laravel-echo-server" target="_blank">laravel-echo-server</a>&nbsp;(與 application server 並行) 搭配前端&nbsp;Socket.io 達成 html5 web socket，主動推播。<br><br></p>



<h2 class="wp-block-heading">結論</h2>



<p>收穫滿滿吧。主要聽到新的觀念，或是已知的東西/問題看大神是用哪個角度去切入。PHPConf 一天的票價 1000 元，larry 是覺得太划算了。一整天，吹著冷氣，聽著大神們分享經驗和實際的乾貨，1000 塊實在太便宜了。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[好文分享] 5 Surprises for PHP Developers Coming to JavaScript</title>
		<link>https://blog.yuyansoftware.com.tw/2016/06/5-surprises-for-php-developers-to-js/</link>
					<comments>https://blog.yuyansoftware.com.tw/2016/06/5-surprises-for-php-developers-to-js/#respond</comments>
		
		<dc:creator><![CDATA[Larry]]></dc:creator>
		<pubDate>Sun, 12 Jun 2016 12:09:00 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[前端工程]]></category>
		<category><![CDATA[好文記錄與分享]]></category>
		<category><![CDATA[Link4]]></category>
		<guid isPermaLink="false">http://test234.yuyansoftware.com.tw/2016/06/12/%e5%a5%bd%e6%96%87%e5%88%86%e4%ba%ab-5-surprises-for-php-developers-coming-to-javascript/</guid>

					<description><![CDATA[http://radar.oreilly.com/2013/06/5-surprises-for-php-de &#8230; ]]></description>
										<content:encoded><![CDATA[<div><a href="http://radar.oreilly.com/2013/06/5-surprises-for-php-developers-coming-to-javascript.html" target="_blank" rel="noopener noreferrer"><span style="font-size: large;">http://radar.oreilly.com/2013/06/5-surprises-for-php-developers-coming-to-javascript.html</span></a></div>
<div><span style="font-size: large;"><br />
</span></div>
<p><span style="font-size: large;">1. Functions are objects</span></p>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* function 是一種 object, 所以它也有 built-in property 或是動態設定 property.</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* function 可以當 input argument, 也可以當 return variable.</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">2. Function scope</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* nested function 子層級的 function 可以看到父層級 function 的 variable, PHP 不行，PHP 下層 scope 也看不到 global variable, 除非用 global keyword.</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">3. Hoisting</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* 變數或 function 宣告都自動提升到該 scope 的上方。注意提升到上方的變數初始為 undefined, 所以如果不是一開始就初始的變數，在初始之前是 undefined.</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* 一般 function 宣告會 hoisting，但如果是 assign function as a variable, 一樣，該 variable 會 hoisting 到上方初始為 undefined.</span></div>
<div><span style="font-size: large;"></span><br />
<a name="more"></a><span style="font-size: large;">4. No classes</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* 這是 JS 和一般 OO 語言最大的不同之一，沒有 class，而且 object 可以動態新增 property.</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">5. Constructors and prototypes</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* JS 的 constructor 是 &#8220;constructor function&#8221;, PHP 是 (double underscore)</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div>
<div><span style="font-size: large;">function __construct() {</span></div>
<div><span style="font-size: large;">&nbsp; &nbsp; &nbsp;&nbsp;</span></div>
<div><span style="font-size: large;">}</span></div>
</div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">* JS 的繼承實作</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div>
<div><span style="font-size: large;">function Animal() {</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">}</span></div>
<div><span style="font-size: large;">&nbsp;&nbsp;</span></div>
<div><span style="font-size: large;">function Dog() {</span></div>
<div><span style="font-size: large;"><br />
</span></div>
<div><span style="font-size: large;">}</span></div>
<div><span style="font-size: large;">&nbsp;&nbsp;</span></div>
<div><span style="font-size: large;">Dog.prototype = new Animal();</span><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">注意子類別新的 property 不會出現在 prototype 裡 (ex: Dog.prototype)。另外子類別可以複寫父類別的 property (constructing 順序的問題)。</span><br />
<span style="font-size: large;"><br />
</span><span style="font-size: large;">* JS&nbsp;ECMAScript 6 有導入 class, constructor, extends 等 keyword.</span></p>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.yuyansoftware.com.tw/2016/06/5-surprises-for-php-developers-to-js/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
