Hướng dẫn php function without class - hàm php không có lớp

Mã bạn đã đăng có đầy đủ các vấn đề.

var_dump($joiliePage->getSomeData);

ERROR:
Notice: Undefined variable: joiliePage in output.php on line 173
Notice: Trying to get property of non-object in output.php on line 173
**NULL**

Giả sử là dòng 173 là thông báo được liệt kê ở trên, cả hai thông báo lỗi đều nói theo cùng một điều: biến

public function __construct(){
    global $getSomeData;
    $getSomeData();
}
0 không được khởi tạo (và trình thông dịch xem xét giá trị của nó là
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
1).

Đừng bị lừa bởi thực tế là PHP phân loại chúng là "thông báo". Chúng là thông báo từ quan điểm của thông dịch viên (nó không thể tìm thấy một biến) nhưng chúng là lỗi cho mã của bạn vì nó không thể tiếp tục thành công.


include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}

Hàm được gọi là

public function __construct(){
    global $getSomeData;
    $getSomeData();
}
2 nhưng bạn có thể muốn nó là hàm tạo của lớp. Nó không phải là hàm tạo và nó không được trình thông dịch gọi tự động vì nó không có tên chính xác. Tên của hàm tạo là
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
3. Lưu ý rằng có một "S" ở giữa bị thiếu trong mã của bạn.constructor. It is not the constructor and it is not called automatically by the interpreter because it doesn't have the correct name. The name of the constructor is
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
3. Notice there is an "s" in the middle that is missing in your code.

Phương pháp

public function __construct(){
    global $getSomeData;
    $getSomeData();
}
2 tuyên bố biến toàn cầu
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
5. Nếu tệp
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
6 được bao gồm thành công (nó có thể thất bại với cảnh báo mà không phá vỡ tập lệnh nếu tệp không tồn tại) thì ký hiệu
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
5 đề cập đến biến có cùng tên được xác định trong tệp
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
6.If the file
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
6 is successfully included (it may fail with a warning without breaking the script if the file does not exists) then the
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
5 symbol refers to the variable with the same name defined in file
public function __construct(){
    global $getSomeData;
    $getSomeData();
}
6.

Tuy nhiên, cuộc gọi

public function __construct(){
    global $getSomeData;
    $getSomeData();
}
9 không đề cập đến biến toàn cầu này. Nó sử dụng thuộc tính của lớp có cùng tên, được khởi tạo. Mã này sẽ không chạy.

Để gọi hàm được lưu trữ trong biến toàn cầu

public function __construct(){
    global $getSomeData;
    $getSomeData();
}
5, mã sẽ đọc:

public function __construct(){
    global $getSomeData;
    $getSomeData();
}

Cũng lưu ý rằng câu lệnh bị thiếu một dấu chấm phẩy ở cuối và tạo ra lỗi cú pháp. Định nghĩa của lớp của bạn không chính xác, nó không được biên dịch và các đối tượng loại


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

1 không thể được tạo.

Trước khi mình giới thiệu qua một số hàm thường dùng trong WordPress, mình muốn nói trước về khái niệm Class (lớp) và Object (đối tượng) trong PHP vì rất nhiều hàm trong WordPress trả kết quả về là dạng đối tượng nên bạn nên đọc bài này để hiểu cách hoạt động của Lớp và Đối tượng. Bây giờ bạn cần biết trước rằng đối tượng là kiểu dữ liệu được tạo ra bởi một lớp.

Định nghĩa Lớp và Đối tượng

Lớp nghĩa là một khung kịch bản của một đối tượng, hoặc bạn có thể hiểu đối tượng được tạo ra từ một lớp. Trong lớp nó sẽ có các biến mà biến này ta gọi là các thuộc tính (properties), và lớp nó có thể chứa các hàm mà các hàm này chúng ta gọi nó là phương thức (method).

Mình có ví dụ sau, chiếc xe là lớp, trong chiếc xe đó nó có các thuộc tính như màu đỏ, 1 cầu 2 cầu, và các hành động như chạy, lùi, thắng ta xem như một phương thức.

Hướng dẫn php function without class - hàm php không có lớp

Định nghĩa của Class và Object. Ảnh: phpenthusiast

Bây giờ chúng ta cùng viết một lớp tên là


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

2 như sau.


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

Trong đó, mình tạo ra một thuộc tính


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

3 trong lớp meeting, biến này mình có đặt từ khoá là

class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

4 mà cái này tí nữa mình sẽ giải thích sau.

Kế đó mình tạo thêm một phương thức tên


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

5 trong lớp và nó sẽ trả về là giá trị của thuộc tính

class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

3 kèm theo một đoạn chữ. Lưu ý rằng khi mình viết code trong một lớp mà nếu mình muốn sử dụng một thuộc tính nào đó có trong lớp thì sẽ sử dụng từ khoá

class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

7.

Bây giờ chúng ta đã có 2 phương thức và một thuộc tính trong lớp. Chúng ta sẽ sử dụng nó bằng cách tạo ra một biến để hứng lớp này.

[code lang=”php”]$say = new meeting;[/code]

Nghĩa là khi sử dụng lớp, chúng ta cần cho biến nào hứng dữ liệu của lớp thì sẽ có từ khoá new đằng trước tên lớp cần sử dụng.

Bây giờ bạn dump cái biến


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

8, bạn sẽ thấy nó có kiểu dữ liệu là Object.Object.


echo ‘
’;
var_dump($say);
object(meeting)#117 (1) {
  ["name"]=>
  string(5) "Thach"
}

Bạn thấy, nó trả về dữ liệu kiểu đối tượng và cho ta thấy đối tượng đó có một thuộc tính tên là


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

9. Bây giờ chúng ta có đối tượng

class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

8 rồi, chúng ta muốn sử dụng thuộc tính

class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

9 trong đó thì chỉ cần viết là

echo ‘
’;
var_dump($say);
2 là nó sẽ ra.

Và nếu cần gọi một phương thức trong lớp thì chỉ cần viết


echo ‘
’;
var_dump($say);
3 hoặc

echo ‘
’;
var_dump($say);
4 là nó ra. Lưu ý là khi gọi phương thức và thuộc tính, sử khác biệt của nó là thuộc tính không có ký tự

echo ‘
’;
var_dump($say);
5 phía sau như phương thức.


$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;

Truyền tham số vào lớp

Như ở ví dụ trên, chúng ta có thuộc tính


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

3 có giá trị sẵn là

echo ‘
’;
var_dump($say);
7. Vậy chúng ta cần tự thiết lập giá trị này khi tạo đối tượng thì làm sao? Trước hết, chúng ta phải tạo ra cho nó thêm một phương thức nào đó mà nó sẽ có nhiệm vụ truyền tham số đã được khai báo khi tạo ra đối tượng.


class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

Ngay tại dòng 5 đến dòng 8, bạn có thể thấy mình tạo ra một phương thức tên


echo ‘
’;
var_dump($say);
8 với tham số là

echo ‘
’;
var_dump($say);
9 để truyền tham số mà người dùng nhập vào.

Trong phương thức này, mình sẽ chỉ định cho thuộc tính


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

3 của class sẽ sử dụng tham số truyền vào là

echo ‘
’;
var_dump($say);
9.

Cuối cùng là ở phương thức


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

5, mình sẽ return lại giá trị mà thằng

echo ‘
’;
var_dump($say);
8 đã truyền vào với từ khoá
object(meeting)#117 (1) {
  ["name"]=>
  string(5) "Thach"
}
4.

Và khi sử dụng, chúng ta sẽ thiết lập tham số ở phương thức


echo ‘
’;
var_dump($say);
8.


$say = new meeting;
$say->set_name(‘Super Man’);
echo $say->hello();

Đơn giản vậy thôi.

Phương thức khởi tạo ( __construct() )

Phương thức khởi tạo này nghĩa là một phương thức mà nó sẽ được tự động thực thi khi chúng ta tạo ra một đối tượng mới, và các tham số trong phương thức này chúng ta có thể truyền nó vào ngay lúc tạo ra đối tượng.

Bây giờ quay lại ví dụ của bài truyền tham số, chúng ta dùng phương thức


echo ‘
’;
var_dump($say);
8 để truyền cái

class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

3 vào. Nhưng nếu bạn không muốn làm bước này, muốn truyền một tham số gì đó toàn cục trong lớp thì nên sử dụng phương thức
object(meeting)#117 (1) {
  ["name"]=>
  string(5) "Thach"
}
8.


    class meeting {
        public $name;
        public $skill;
        function __construct($ten, $kynang)
        {
            $this->name = $ten;
            $this->skill = $kynang;
        }

        

function hello()
        {
            return "Hello, my name is $this->name, my skill is $this->skill";
        }
    }

         $say = new meeting(‘Thach’, ‘WordPress’);
    echo $say->hello();

Nhưng bạn nhớ rằng công dụng của

public function __construct(){
    global $getSomeData;
    $getSomeData();
}
3 là sẽ thực hiện cái gì đó mỗi khi ta tạo ra một đối tượng từ lớp nên bạn đừng hiểu là nó chỉ có chức năng truyền tham số vào lớp nhé.

Hint: Lớp WP_Query trong WordPress có cách sử dụng tương tự, xem hướng dẫn.: Lớp WP_Query trong WordPress có cách sử dụng tương tự, xem hướng dẫn.

Kế thừa lớp

Kế thừa lớp nghĩa là bạn tạo ra một lớp con mới sẽ kế thừa lại một lớp nào đó với các thuộc tính và phương thức có sẵn, từ đó bạn có thể tuỳ biến lại code bên trong một phương thức hoặc thuộc tính nào đó.

Ví dụ, mình có lớp Car được gọi là lớp mẹ, trong đây sẽ có sẵn các thuộc tính và phương thức của một chiếc xe như màu sắc, chạy, lùi,…Sau đó mình tạo ra một lớp khác con tên BMW và nó sẽ kế thừa lại lớp Car này vì BMW nó cũng cần màu sắc, cũng cần chạy, lùi mà.

Trước hết chúng ta tạo lớp


$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;
0 và khai báo thuộc tính cũng như các phương thức của nó.

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
0

Sau đó chúng ta tạo ra lớp


$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;
1 và nó sẽ kế thừa lại lớp

$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;
0.

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
1

Lúc này lớp


$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;
1 sẽ sử dụng được các thuộc tính và phương thức của lớp

$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;
0. Nếu cần tinh chỉnh lại thuộc tính hay phương thức nào thì cứ việc khai báo lại bên trong nó, như ví dụ trên là mình khai báo giá trị của các thuộc tính trong lớp

$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;
1.

Bây giờ chúng ta thử sử dụng phương thức


$say = new meeting;
echo $say->name . ‘
’;
echo $say->hello() . ‘
’;
echo $say->goodbye() . ‘
’;
6 của lớp Car và vào lớp BMW nhé.

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
2

Visibility trong lớp

Ở các ví dụ trên, bạn có thể thấy mình sử dụng từ khoá


class meeting {

    public $name = ‘Thach’;

    function hello()
    {
        return $this->name . ‘ saying hello’;
    }

    function goodbye()
    {
        return $this->name . ‘ saying goodbye’;
    }
}

4 khi khai báo thuộc tính và phương thức. Và từ khoá này được gọi là từ khoá visibility. Hiện tại trong lớp, bạn sẽ sử dụng 3 từ khoá phổ biến nhất hiện tại như:


  • class meeting {

        public $name = ‘Thach’;

        function hello()
        {
            return $this->name . ‘ saying hello’;
        }

        function goodbye()
        {
            return $this->name . ‘ saying goodbye’;
        }
    }

    4 – Nếu phương thức hoặc thuộc tính nào sử dụng từ khoá này thì nghĩa là chúng ta có thể sử dụng nó ở bất cứ đâu, tức là có thể gọi ra bên trong một lớp hoặc bên ngoài một lớp, hoặc sử dụng trong một lớp con (lớp được kế thừa).

  • $say = new meeting;
    echo $say->name . ‘
    ’;
    echo $say->hello() . ‘
    ’;
    echo $say->goodbye() . ‘
    ’;
    9 – Phương thức/Thuộc tính nào sử dụng từ khoá này thì nó chỉ được truy cập bên trong một lớp của chính nó, không thể sử dụng cho lớp khác hoặc không thể gọi ra bên ngoài. Ví dụ bạn có thể sử dụng $this->name bên trong lớp như không thể gọi ra với $object->name ở bên ngoài lớp.

  • class meeting {
        public $name;

        public function set_name( $ten )
        {
            $this->name = $ten;
        }

        public function hello()
        {
            return $this->name . ‘ saying hello’;
        }
    }

    0 – Phương thức/Thuộc tính nào sử dụng từ khoá này là nó sẽ có thể được truy cập bên trong class hoặc các class kế thừa.

Ví dụ về public

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
3

Ví dụ về private

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
4

Ví dụ về protected

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
5

Lớp trừu tượng (Class Abstraction)

Một lớp trừu tượng nghĩa là nó có một hoặc nhiều phương thức là trừu tượng. Phương thức trừu tượng thì nghĩa là nó phải bắt buộc được khai báo ở các lớp con. Bạn nên lưu ý rằng dù lớp của bạn có bao nhiêu phương thức trừu tượng thì lớp đó vẫn là lớp trừu tượng.

Để khai báo lớp trừu tượng thì chúng ta chỉ việc thêm từ khoá


class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

1 đằng trước tên class và tên phương thức mà ta muốn làm trừu tượng. Lưu ý là phương thức khai báo trừu tượng sẽ không chứa bất cứ cái gì, ngoại trừ tham số.

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
6

Code ở trên là chúng ta tạo ra một lớp tên


class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

2 và nó là trừu tượng vì có từ khoá

class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

1 ở trước. Bên trong nó ta có thuộc tính

class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

4 là dạng

class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

0 để ta có thể sử dụng nó ở các lớp con nhưng không cho phép truy cập từ bên ngoài.

Sau đó chúng ta có phương thức trừu tượng tên


class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

6, tức là phương thức này sẽ phải được bắt buộc khai báo ở lớp con. Cuối cùng là ta có phương thức public là

class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

7 để có thể sử dụng nó bên ngoài cho mục đích lấy dữ liệu hiển thị, và chức năng của phương thức này là hiển thị kết quả trả về của phương thức

class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

6 sau khi nó xử lý.

Bây giờ chúng ta tạo ra một lớp con kế thừa lại lớp mẹ và thử không khai báo phương thức


class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

6 cho nó xem cái gì xảy ra nhé.

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
7

Lúc này bạn sẽ nhận được lỗi này:

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
8

Như vậy, bạn phải khai báo phương thức


class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

6 thì mới được. Ta sửa lại như sau:

include_once 'bradpitt.php';
class Jolie{
    public $getSomeData;
    public function __contruct(){
        global $getSomeData;
        $this->$getSomeData()
    }
}
9

Kết quả nó sẽ trả về array của thằng


class meeting {
    public $name;

    public function set_name( $ten )
    {
        $this->name = $ten;
    }

    public function hello()
    {
        return $this->name . ‘ saying hello’;
    }
}

6.

Lời kết

Trong bài này mục đích của mình là muốn cho bạn hiểu thật kỹ về khái niệm Class và Object trong PHP, và khi code chúng ta hoàn toàn sử dụng Class và Object người ta gọi đó là Lập trình hướng đối tượng. Như vậy lập trình hướng đối tượng không phải là khó, chỉ là bạn chưa biết cách nên nghe tên nó có vẻ cao sang nhưng thực ra nó cũng chỉ là việc sử dụng class, kế thừa rồi sử dụng các đối tượng tạo ra từ class mà thôi.

Tạm thời ở đây bạn đã hiểu được dữ liệu đối tượng rồi. Ở bài sau, mình sẽ nói qua cho bạn về một số hàm tiêu biểu trong WordPress để bạn sử dụng, lúc đó bạn sẽ làm việc với đối tượng nhiều hơn nữa.

Hướng dẫn php function without class - hàm php không có lớp

Thạch Phạm

Bé Thạch 18 tuổi, hiện công tác tại AZDIGI với vị trí giữ xe và viết thuê tại ThachPham.Com. Sở thích nghiên cứu về website, DevOps, SysAdmin và xăm mình nữa. Phương châm sống của bé là "No Pain, No Gain".

Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng.