svn: /phpdoc/kr/trunk/language/oop5/ traits.xml
[email protected] (Yu Ilho)
| Newsgroups | php.doc.kr |
|---|---|
| Message-ID | <[email protected]> |
acidd15 Sun, 09 Aug 2015 12:27:25 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=337378
Log:
translated
Changed paths:
A phpdoc/kr/trunk/language/oop5/traits.xml
svn-diffs-337378.txt
(text/x-diff, 12.6 KB)
Added: phpdoc/kr/trunk/language/oop5/traits.xml
===================================================================
--- phpdoc/kr/trunk/language/oop5/traits.xml (rev 0)
+++ phpdoc/kr/trunk/language/oop5/traits.xml 2015-08-09 12:27:25 UTC (rev 337378)
@@ -0,0 +1,468 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 337316 Maintainer: acidd15 Status: ready -->
+<!-- Reviewed: no -->
+
+ <sect1 xml:id="language.oop5.traits" xmlns="http://docbook.org/ns/docbook">
+ <title>트레이트</title>
+ <para>
+ PHP 5.4.0 부터, 트레이트 라는 코드 재사용 방법을 구현했습니다.
+ </para>
+ <para>
+ 트레이트는 PHP와 같은 단일상속 언어를 위한 코드 재사용 기법입니다.
+ 트레이트는 단일상속의 몇가지 한계를 줄이기 위해 고안되었습니다.
+ 개발자들은 서로 다른 클래스 계층구조를 가지는 독립 클래스들에서 자유롭게 메서드셋을 재사용할수 있습니다.
+ 트레이트와 클래스의 조합에 대한 의의는 복잡성을 줄이고, 다중상속과 믹신(Mixin)과 연관된 통상적인 문제를 줄이는데 있습니다.
+ </para>
+ <para>
+ 트레이트는 클래스와 비슷하지만, 매끄럽고 일관된 방법으로 기능을 그룹화하기 위해 고안되었습니다.
+ 트레이트는 자신을 인스턴스화할 수 없습니다. 트레이트는 기존의 상속을 확장하고, 수평적으로 동작을 내재화 할수 있도록 합니다.
+ 이말은, 상속없이 클래스 멤버에 추가할수 있음을 의미합니다.
+ </para>
+
+ <example xml:id="language.oop5.traits.basicexample">
+ <title>트레이트 예제</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait ezcReflectionReturnInfo {
+ function getReturnType() { /*1*/ }
+ function getReturnDescription() { /*2*/ }
+}
+
+class ezcReflectionMethod extends ReflectionMethod {
+ use ezcReflectionReturnInfo;
+ /* ... */
+}
+
+class ezcReflectionFunction extends ReflectionFunction {
+ use ezcReflectionReturnInfo;
+ /* ... */
+}
+?>
+]]>
+ </programlisting>
+ </example>
+
+ <sect2 xml:id="language.oop5.traits.precedence">
+ <title>우선순위</title>
+ <para>
+ 기본 클래스로부터 상속된 멤버는 트레이트의 의해 추가된 멤버에 의한 방법이 우선 됩니다.
+ 우선순위는 현재 클래스의 멤버를 트레이트의 메서드로 재정의하고, 그 다음이 상속된 메서드를 재정의하는 순서입니다.
+ </para>
+ <example xml:id="language.oop5.traits.precedence.examples.ex1">
+ <title>우선순위 예제</title>
+ <para>
+ 기본 클래스로부터 상속된 메서드는 MyHelloWorld 에 추가된 SayWorld 트레이트의 메서드의해 재정의됩니다.
+ MyHelloWord 클래스에 메서드가 정의된것과 같이 동작합니다.
+ 우선순위는 현재클래스의 메서드를 트레이트 메서드로 재정의하고, 그 다음으로 기본 클래스의 메서드를 재정의하는 순서입니다.
+ </para>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class Base {
+ public function sayHello() {
+ echo 'Hello ';
+ }
+}
+
+trait SayWorld {
+ public function sayHello() {
+ parent::sayHello();
+ echo 'World!';
+ }
+}
+
+class MyHelloWorld extends Base {
+ use SayWorld;
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+Hello World!
+]]>
+ </screen>
+ </example>
+ <example xml:id="language.oop5.traits.precedence.examples.ex2">
+ <title>다른 우선순위 예제</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait HelloWorld {
+ public function sayHello() {
+ echo 'Hello World!';
+ }
+}
+
+class TheWorldIsNotEnough {
+ use HelloWorld;
+ public function sayHello() {
+ echo 'Hello Universe!';
+ }
+}
+
+$o = new TheWorldIsNotEnough();
+$o->sayHello();
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+Hello Universe!
+]]>
+ </screen>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.oop5.traits.multiple">
+ <title>다중 트레이트</title>
+ <para>
+ 다중 트레이트는 콤마로 구분하여 클래스에 삽입될수 있습니다.
+ </para>
+ <example xml:id="language.oop5.traits.multiple.ex1">
+ <title>다중 트레이트 사용법</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait Hello {
+ public function sayHello() {
+ echo 'Hello ';
+ }
+}
+
+trait World {
+ public function sayWorld() {
+ echo 'World';
+ }
+}
+
+class MyHelloWorld {
+ use Hello, World;
+ public function sayExclamationMark() {
+ echo '!';
+ }
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+$o->sayWorld();
+$o->sayExclamationMark();
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+Hello World!
+]]>
+ </screen>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.oop5.traits.conflict">
+ <title>충돌 해결</title>
+ <para>
+ 같은 메서드 이름을 가진 트레이트가 삽입된다면, 충돌이 명시적으로 해결되지 않는한 치명적인(fatal) 에러가 날것입니다.
+ </para>
+ <para>
+ 동일 클래스내에서 트레이트들간의 이름 충돌을 해결하기 위해서는,
+ <literal>insteadof</literal> 연산자로 확실하게 사용할 메서드를 골라줄 필요가 있습니다.
+ </para>
+ <para>
+ 이 방법은 다른 메서드들을 배제하고 하나믜 메서드만 허용합니다. <literal>as</literal> 연산자를 사용하면
+ 충돌되는 메서드를 다른 이름을 사용하여 포함할수 있습니다.
+ </para>
+ <example xml:id="language.oop5.traits.conflict.ex1">
+ <title>충돌 해결 예제</title>
+ <para>
+ 이 예제에서는, Talker 는 틀레이트 A와 B를 사용합니다.
+ A와 B의 메서드가 충돌하지만, 트레이트 B의 smallTalk와 트레이트 A의 bigTalk의 사용하도록 정의 합니다.
+ </para>
+ <para>
+ Aliased_Talker는 <literal>as</literal> 연산자를 사용하여 B의 bigTalk 구현을
+ <literal>talk</literal> 로 별칭을 사용하도록 만듭니다.
+ </para>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait A {
+ public function smallTalk() {
+ echo 'a';
+ }
+ public function bigTalk() {
+ echo 'A';
+ }
+}
+
+trait B {
+ public function smallTalk() {
+ echo 'b';
+ }
+ public function bigTalk() {
+ echo 'B';
+ }
+}
+
+class Talker {
+ use A, B {
+ B::smallTalk insteadof A;
+ A::bigTalk insteadof B;
+ }
+}
+
+class Aliased_Talker {
+ use A, B {
+ B::smallTalk insteadof A;
+ A::bigTalk insteadof B;
+ B::bigTalk as talk;
+ }
+}
+?>
+]]>
+ </programlisting>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.oop5.traits.visibility">
+ <title>메서드 가시성 변경</title>
+ <para>
+ <literal>as</literal> 구문을 사용하여, 가시성또한 조정할 수 있습니다.
+ </para>
+ <example xml:id="language.oop5.traits.visibility.ex1">
+ <title>메서드 가시성 변경 예제</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait HelloWorld {
+ public function sayHello() {
+ echo 'Hello World!';
+ }
+}
+
+// sayHello 가시성 변경
+class MyClass1 {
+ use HelloWorld { sayHello as protected; }
+}
+
+// 메서드를 별칭을 지정하여 가시성을 변경하면
+// sayHello 의 가시성은 변경되지 않습니다.
+class MyClass2 {
+ use HelloWorld { sayHello as private myPrivateHello; }
+}
+?>
+]]>
+ </programlisting>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.oop5.traits.composition">
+ <title>트레이트로 조합된 트레이트</title>
+ <para>
+ 클래스들이 트레이트를 사용할수 있는것처럼 트레이트도 트레이트를 사용할 수 있습니다.
+ 하나또는 여러 트레이트를 하나의 트레이트로 정의하기 위해서, 부분적 혹은 전체적으로 조합할수 있습니다.
+ </para>
+ <example xml:id="language.oop5.traits.composition.ex1">
+ <title>Traits Composed from Traits</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait Hello {
+ public function sayHello() {
+ echo 'Hello ';
+ }
+}
+
+trait World {
+ public function sayWorld() {
+ echo 'World!';
+ }
+}
+
+trait HelloWorld {
+ use Hello, World;
+}
+
+class MyHelloWorld {
+ use HelloWorld;
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+$o->sayWorld();
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+Hello World!
+]]>
+ </screen>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.oop5.traits.abstract">
+ <title>추상 트레이트 멤버</title>
+ <para>
+ 트레이트는 클래스의 요구사항을 강요하기위해 추상 메서드의 사용을 지원합니다.
+ </para>
+ <example xml:id="language.oop5.traits.abstract.ex1">
+ <title>추상 메서드에 의햔 요구사항 표현</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait Hello {
+ public function sayHelloWorld() {
+ echo 'Hello'.$this->getWorld();
+ }
+ abstract public function getWorld();
+}
+
+class MyHelloWorld {
+ private $world;
+ use Hello;
+ public function getWorld() {
+ return $this->world;
+ }
+ public function setWorld($val) {
+ $this->world = $val;
+ }
+}
+?>
+]]>
+ </programlisting>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.oop5.traits.static">
+ <title>정적 트레이트 멤버</title>
+ <para>
+ 트레이트는 정적 멤버와 정적 메서드로 정의 가능합니다.
+ </para>
+ <example xml:id="language.oop5.traits.static.ex1">
+ <title>정적 변수</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait Counter {
+ public function inc() {
+ static $c = 0;
+ $c = $c + 1;
+ echo "$c\n";
+ }
+}
+
+class C1 {
+ use Counter;
+}
+
+class C2 {
+ use Counter;
+}
+
+$o = new C1(); $o->inc(); // echo 1
+$p = new C2(); $p->inc(); // echo 1
+?>
+]]>
+ </programlisting>
+ </example>
+ <example xml:id="language.oop5.traits.static.ex2">
+ <title>정적 메서드</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait StaticExample {
+ public static function doSomething() {
+ return 'Doing something';
+ }
+}
+
+class Example {
+ use StaticExample;
+}
+
+Example::doSomething();
+?>
+]]>
+ </programlisting>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.oop5.traits.properties">
+ <title>프로퍼티</title>
+ <para>
+ 트레이트는 프로퍼티를 정의할 수 있습니다.
+ </para>
+ <example xml:id="language.oop5.traits.properties.example">
+ <title>프로퍼티 정의</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait PropertiesTrait {
+ public $x = 1;
+}
+
+class PropertiesExample {
+ use PropertiesTrait;
+}
+
+$example = new PropertiesExample;
+$example->x;
+?>
+]]>
+ </programlisting>
+ </example>
+ <para>
+ 트레이트가 프로퍼티를 정의하면 클래스는 같은 이름으로 프로퍼티를 정의할수 없습니다. 그렇지 않을 경우 에러가 발생합니다.
+ <constant>E_STRICT</constant> 는 클래스 정의가 동일할때(같은 가시성과 초기값을 가진경우) 발생하며, 그렇지 않을경우에는 치명적인 에러가 발생합니다.
+ </para>
+ <example xml:id="language.oop5.traits.properties.conflicts">
+ <title>충돌 해결</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+trait PropertiesTrait {
+ public $same = true;
+ public $different = false;
+}
+
+class PropertiesExample {
+ use PropertiesTrait;
+ public $same = true; // Strict Standards
+ public $different = true; // Fatal error
+}
+?>
+]]>
+ </programlisting>
+ </example>
+ </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/traits.xml
___________________________________________________________________
Added: svn:keywords
+ Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
Added: svn:eol-style
+ native