svn: /phpdoc/kr/trunk/language/oop5/ late-static-bindings.xml
[email protected] (Yu Ilho)
| Newsgroups | php.doc.kr |
|---|---|
| Message-ID | <[email protected]> |
acidd15 Sun, 26 Jul 2015 14:36:31 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=337239
Log:
translated
Changed paths:
A phpdoc/kr/trunk/language/oop5/late-static-bindings.xml
Added: phpdoc/kr/trunk/language/oop5/late-static-bindings.xml
===================================================================
--- phpdoc/kr/trunk/language/oop5/late-static-bindings.xml (rev 0)
+++ phpdoc/kr/trunk/language/oop5/late-static-bindings.xml 2015-07-26 14:36:31 UTC (rev 337239)
@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 305233 Maintainer: acidd15 Status: ready -->
+<!-- Reviewed: no -->
+
+ <sect1 xml:id="language.oop5.late-static-bindings" xmlns="http://docbook.org/ns/docbook">
+ <title>늦은 정적 바인딩</title>
+ <para>
+ PHP 5.3.0 부터, 늦은 정적 바인딩이라는 기능을 구현했습니다. 정적 상속 컨텍스트내에서 호출된 클래스를 참조하는데 사용할 수 있습니다.
+ </para>
+
+ <para>
+ 자세히 말하자면, 늦은 정적 바인딩은 마지막 "비전달 호출(non-forwarding call)" 내의 클래스명을 저장하여 동작합니다.
+ 정적 메서드 콜의 경우에는, 명명된 클래스명 입니다(대부분
+ <link linkend="language.oop5.paamayim-nekudotayim"><literal>::</literal></link> 연산자 좌측에 붙습니다);
+ 비정적 메서드 콜의 경우에는, 객체의 클래스명 입니다.
+ "전달 호출(forwarding call)" 은 <literal>self::</literal>,
+ <literal>parent::</literal>, <literal>static::</literal>, 또는 클래스 계층구조에서,
+ <function>forward_static_call</function> 에 의한 정적인 호출 방법입니다.
+
+ <function>get_called_class</function> 함수로 호출 클래스의 이름을 가져올수 있으며,
+ <literal>static::</literal> 은 해당 클래스의 스코프입니다.
+ </para>
+
+ <para>
+ 이 기능은 내부적인 동작을 고려하여 "늦은 정적 바인딩" 이라고 이름지어 졌습니다.
+ "늦은 바인딩" 은 <literal>static::</literal> 이 메서드가 정의된 클래스를 결정할수 없으며, 실행시 정보에 의해 정해지는 사실로부터 유래합니다.
+
+ 이 것은 또한 정적 메서드 호출(그렇게 제한한것은 아니지만) 로 사용할수 있으므로 "정적 바인딩" 이라고 부를수 있습니다.
+ </para>
+
+ <sect2 xml:id="language.oop5.late-static-bindings.self">
+ <title><literal>self::</literal> 제약사항</title>
+ <para>
+ 현재 클래스에 대한 정적레퍼런스인 <literal>self::</literal> 나 <literal>__CLASS__</literal>
+ 는 사용하는 함수가 어디에 정의되었느냐에 따라 결정됩니다.
+ </para>
+ <example>
+ <title><literal>self::</literal> 사용법</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class A {
+ public static function who() {
+ echo __CLASS__;
+ }
+ public static function test() {
+ self::who();
+ }
+}
+
+class B extends A {
+ public static function who() {
+ echo __CLASS__;
+ }
+}
+
+B::test();
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+A
+]]>
+ </screen>
+ </example>
+
+ </sect2>
+
+ <sect2 xml:id="language.oop5.late-static-bindings.usage">
+ <title>늦은 정적 바인딩의 사용법</title>
+
+ <para>
+ 늦은 정적바인딩은 위의 제한을 해결하기 위해 실행시에 최초로 호출된 클래스에 대해 참조하도록 키워드를 도입했습니다.
+ 다시말하면, 키워드는 앞의 예제에서 test() 함수로부터 <literal>B</literal>를 참조 할수 있도록 합니다.
+ 새로운 키워드 대신에 <literal>static</literal> 키워드를 사용하기로 하였습니다.
+ </para>
+
+ <example>
+ <title><literal>static::</literal> 간단한 사용법</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class A {
+ public static function who() {
+ echo __CLASS__;
+ }
+ public static function test() {
+ static::who(); // 늦은 정적 바인딩
+ }
+}
+
+class B extends A {
+ public static function who() {
+ echo __CLASS__;
+ }
+}
+
+B::test();
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+B
+]]>
+ </screen>
+ </example>
+ <note>
+ <para>
+ 비정적 컨텍스트에서는, 호출된 클래스는 오브젝트의 클래스와 동일합니다.
+ <literal>$this-></literal> 는 동일한 스코프내의 private 메서드를 호출하려고 하기 때문에,
+ <literal>static::</literal> 를 사용하는것은 다른결과를 얻게 됩니다.
+ 또다른 다른점은 <literal>static::</literal> 은 정적 속성만을 참조할수 있다는 것입니다.
+ </para>
+ </note>
+ <example>
+ <title><literal>static::</literal> 비정적 컨텍스트에서의 사용법</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class A {
+ private function foo() {
+ echo "success!\n";
+ }
+ public function test() {
+ $this->foo();
+ static::foo();
+ }
+}
+
+class B extends A {
+ /* foo() 는 B로 복사됩니다, 스코프가 여전히 A에 있는 이유로 호출은 성공합니다. */
+}
+
+class C extends A {
+ private function foo() {
+ /* 본래 메서드가 대치됩니다. 스코프는 C 가 됩니다. */
+ }
+}
+
+$b = new B();
+$b->test();
+$c = new C();
+$c->test(); //fails
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+success!
+success!
+success!
+
+
+Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
+]]>
+ </screen>
+ </example>
+ <note>
+ <para>
+ 늦은 정적 바인딩의 결정은 정적호출이 대체없이 분석될때까지 이뤄집니다.
+ 반면에, <literal>parent::</literal> 또는 <literal>self::</literal> 키워드를 사용하는 정적호출은
+ 호출정보가 전달 됩니다.
+ </para>
+ <example>
+ <title>전달(Forwarding)과 비전달(non-forwarding) 호출</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class A {
+ public static function foo() {
+ static::who();
+ }
+
+ public static function who() {
+ echo __CLASS__."\n";
+ }
+}
+
+class B extends A {
+ public static function test() {
+ A::foo();
+ parent::foo();
+ self::foo();
+ }
+
+ public static function who() {
+ echo __CLASS__."\n";
+ }
+}
+class C extends B {
+ public static function who() {
+ echo __CLASS__."\n";
+ }
+}
+
+C::test();
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+A
+C
+C
+]]>
+ </screen>
+ </example>
+ </note>
+ </sect2>
+ </sect1>
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+indent-tabs-mode:nil
+sgml-parent-document:nil
+sgml-default-dtd-file:"~/.phpdoc/manual.ced"
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+vim600: syn=xml fen fdm=syntax fdl=2 si
+vim: et tw=78 syn=sgml
+vi: ts=1 sw=1
+-->
+
Property changes on: phpdoc/kr/trunk/language/oop5/late-static-bindings.xml
___________________________________________________________________
Added: svn:eol-style
+ native
Added: svn:keywords
+ Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL