Preamble
Object-oriented programming ( OOP
) is a programming technology that supports object technology. If it used to be procedural, module-oriented, and so on, now the world is favored with object-oriented programming. to handle, now when using object orientation, we will split it into objects for processing.
The following article will focus on addressing the following issues:
- The basic characteristics of object-oriented programming How are they expressed in PHP.
- Differences between Abstract Class and Interface.
- What is a static function? Distinguish using the keyword static :: method () with self :: method ().
- What is Trait.
- What is Namespaces.
1. The basic characteristics of object-oriented programming How are they expressed in PHP.
Object-oriented OOP
( OOP
) has 4 basic characteristics:
- Encapsulation
- Inheritance
- Polymorphism
- Abstraction
Encapsulation : Encapsulation is expressed by the fact that the properties and methods are hidden in a class
, with the purpose of controlling usage rights and accessing properties and methods.
The encapsulation in PHP is expressed through the use of the keywords public
, private
, protected
:
public
: Lets use the properties and methods of theclass
inside, outside theclass
, theclass
inherited from there can be flexibly reused.private
: Only allowed within theclass
.protected
: Allows use in scope in parentclass
andclass
inherited from parentclass
.
Inheritance : expressed by class
inheriting methods and properties of the parent class
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span class="token keyword">class</span> <span class="token class-name">Cha</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token variable">$quoctinh</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'Viet Nam'</span> <span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Noi tieng Viet Nam"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Con</span> <span class="token keyword">extends</span> <span class="token class-name">Cha</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">parent</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">new</span> <span class="token class-name">Con</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token operator">=</span> <span class="token operator">></span> Noi tieng Viet Nam |
Abstraction : in object- oriented programming helps reduce complexity by focusing on key characteristics rather than going into details. Thus when interacting with objects only need to care about the properties and methods needed. Details of the content need not pay attention to.
PHP has abstract class
and interface
to abstract objects.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">interface</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Dog</span> <span class="token keyword">implements</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Go go go"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Polymorphism : expressed by the class
can rewrite methods from the parent class
, through extends
and implements
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <span class="token keyword">interface</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Dog</span> <span class="token keyword">implements</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Go go go"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Cat</span> <span class="token keyword">implements</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Meowwww"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">new</span> <span class="token class-name">Dog</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token operator">=</span> <span class="token operator">></span> Go go go <span class="token keyword">new</span> <span class="token class-name">Cat</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token operator">=</span> <span class="token operator">></span> Meowwww |
2. Differences between Abstract Class and Interface.
In part 1, we mentioned two concepts of abstract class
and interface
. Interface
and Abstract class
are 2 basic concepts in OOP programming. But most people feel confused and confused by these two concepts.
Abstract class
: is an abstract class
for all classes with the same nature, therefore, each derived class (subclass) can only inherit from an abstract class. Besides, it does not allow instance
creation, meaning it will not be possible to create objects of that class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Noi..."</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">new</span> <span class="token class-name">Dog</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// => Báo lỗi</span> <span class="token keyword">class</span> <span class="token class-name">Cat</span> <span class="token keyword">extends</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">new</span> <span class="token class-name">Cat</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// => Noi...</span> |
Interface
: This class is considered as a mask for all classes with the same operation but may differ in nature. Since then, the derived class can inherit from many Interface
classes to fully complement the way its operation ( Multiple inheritance ).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <span class="token keyword">interface</span> <span class="token class-name">A</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">method_a</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">B</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">method_b</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">C</span> <span class="token keyword">implements</span> <span class="token class-name">A</span> <span class="token punctuation">,</span> <span class="token constant">B</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">noi</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">method_b</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// TODO: Implement method_b() method.</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">method_a</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// TODO: Implement method_a() method.</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
3. What is a static function? Distinguish using the keyword static :: method () with self :: method ().
What is a static function? : The static
function is a function that can be called without needing an object of that class
. Static
it acts as a global variable even if it is processed in any file (in the same program), it will save the final value that it is made into the class.
1 2 3 4 5 | <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function">staticMethod</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//TODO</span> <span class="token punctuation">}</span> |
The implementation of the static function in the class can be done by the command:
static::staticMethod()
,self::staticMethod()
or$this->staticMethod()
, whereself
andstatic
represent theclass
, and$this
is the representation of theobject
. Instatic
methods,non-static
methods or properties cannot be called. But the methodsnon-static
can call the method or attributestatic
. Because it can be understood as follows:
- The
static
method can be called even before theobject
has been initialized, so if thestatic
method calls on anon-static
, when theobject
not been initialized, there will be no$this
variable (representing theobject
) to call. tonon-static
methods.- Naturally, the
non-static
can always call thestatic
method because thestatic
method already exists from the beginning of the program, when theobject
not been instantiated.
Distinguish using keyword static::method()
with self::method()
:
static
: represents the object itself calling the real methodself
: represents the object that declared it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function">getSeflObject</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">self</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function">getStaticObject</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">static</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Girl</span> <span class="token keyword">extends</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">echo</span> <span class="token function">get_class</span> <span class="token punctuation">(</span> Girl <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">getSeflObject</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//Person</span> <span class="token keyword">echo</span> <span class="token function">get_class</span> <span class="token punctuation">(</span> Girl <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">getStaticObject</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//Girl</span> |
4. What is Trait.
Traits
simply mean a group of methods that you want to include in another class. A Trait
similar to an abstract class
cannot be instantiated on itself. Trait
reduces the limitations of đơn kế thừa
, allowing us to reuse a group of methods on the class
.
A simple Trait
could be:
1 2 3 4 5 6 7 8 | <span class="token keyword">trait</span> Sharable <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">share</span> <span class="token punctuation">(</span> <span class="token variable">$item</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'share this item'</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
We can use it in different class
as follows:
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">class</span> <span class="token class-name">Post</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">Sharable</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">Comment</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">Sharable</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Thus, when you initialize objects from the Post
and Comment
classes, that object will have the share()
method available.
We can use multiple Trait
in a class
.
5. What are Namespaces.
Namespace helps create a namespace for functions and classes in programming in general and in PHP in particular. With PHP, Namespaces
are designed to solve the two problems of authoring libraries and applications when reusing classes and functions.
- Namespaces avoid function names and class names that may overlap when you create them with PHP or third-party functions, classes, variables.
- Namespaces have the ability to create aliases, shorten naming practices, and make code more readable.
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">namespace</span> <span class="token package">App Controllers</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">NewsController</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">index</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token constant">__NAMESPACE__</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
PHP Namespaces
provides a way to group related class
, interface
, function
, and constant
.
Conclude
Through the article, I hope you have understood the basics of object-oriented and its representation in PHP, some widely used concepts.