Hướng dẫn dùng runphponline trong PHP

Nói chung, một file PHP chứa các thẻ HTML và một số code script PHP. Rất dễ dàng để tạo một ví dụ PHP đơn giản. Để làm như vậy, hãy tạo một file và viết thẻ HTML + code PHP và lưu file này với phần mở rộng .php.

Nếu Ace chưa học HTML, có thể tham khảo các series free sau.

Lưu ý: Các câu lệnh PHP kết thúc bằng dấu chấm phẩy [;].

Tất cả code PHP đều nằm giữa thẻ php. Nó bắt đầu bằng . Cú pháp của thẻ PHP được đưa ra dưới đây:

Hãy xem một ví dụ PHP đơn giản trong đó chúng ta đang viết một số văn bản bằng lệnh PHP echo.

file: first.php

Đầu ra:

Hello Series tự học PHP MIỄN PHÍ của Cafedev

Cách chạy các chương trình PHP trong XAMPP, PHP là một ngôn ngữ lập trình phụ trợ phổ biến. Các chương trình PHP có thể được viết trên bất kỳ trình soạn thảo nào, chẳng hạn như – Notepad, Notepad ++, Dreamweaver, v.v. Các chương trình này lưu với phần mở rộng .php , tức là filename.php bên trong thư mục htdocs.

Ví dụ – p1.php.

Vì tôi đang sử dụng window và máy chủ XAMPP của tôi được cài đặt trong ổ D. Vì vậy, đường dẫn cho thư mục htdocs sẽ là “D: \ xampp \ htdocs”.

Chương trình PHP chạy trên trình duyệt web như – Chrome, Internet Explorer, Firefox, v.v. Dưới đây là một số bước để chạy các chương trình PHP.

Bước 1: Tạo một chương trình PHP đơn giản như hello world.

Bước 2: Lưu file với tên hello.php vào thư mục htdocs, nằm bên trong thư mục xampp.

Lưu ý: Chương trình PHP phải được lưu trong thư mục htdocs, nằm bên trong thư mục xampp, nơi bạn đã cài đặt XAMPP. Nếu không, nó sẽ tạo ra lỗi – Không tìm thấy đối tượng.

Bước 3: Chạy máy chủ XAMPP và khởi động Apache và MySQL.

Bước 4: Bây giờ, mở trình duyệt web và nhập localhost //localhost/hello.php trên cửa sổ trình duyệt của bạn.

Bước 5: Kết quả cho chương trình hello.php ở trên sẽ được hiển thị như ảnh chụp màn hình bên dưới:

Hầu hết thời gian, các chương trình PHP chạy như một mô-đun máy chủ web. Tuy nhiên, PHP cũng có thể chạy trên CLI [Giao diện dòng lệnh].

2. Phân biệt chữ hoa chữ thường trong PHP

Trong PHP, từ khóa [ví dụ: echo, if, else, while], các hàm, các hàm do người dùng định nghĩa, các lớp không phân biệt chữ hoa chữ thường. Tuy nhiên, tất cả các tên biến đều phân biệt chữ hoa chữ thường.

Trong ví dụ dưới đây, bạn có thể thấy rằng cả ba câu lệnh echo đều bằng nhau và hợp lệ:

Đầu ra:

Hello world using echo Hello world using ECHO Hello world using EcHo

Hãy xem ví dụ dưới đây rằng tên biến có phân biệt chữ hoa chữ thường. Bạn có thể xem ví dụ bên dưới rằng chỉ câu lệnh thứ hai sẽ hiển thị giá trị của biến $color. Vì nó coi $color, $ColoR và $COLOR là ba biến khác nhau:

Đầu ra:

Notice: Undefined variable: ColoR in D:cafedev\xampp\htdocs\program\p2.php on line 8 My car is My dog is black Notice: Undefined variable: COLOR in D:cafedev\xampp\htdocs\program\p2.php on line 10 My Phone is

Chỉ có biến $color đã in giá trị của nó và các biến khác $ColoR và $COLOR được khai báo là biến không xác định. Đã xảy ra lỗi ở dòng 5 và dòng 7.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

  • Full series tự học PHP từ cơ bản tới nâng cao tại đây nha.
  • Ebook về PHP tại đây.
  • Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

  • Group Facebook
  • Fanpage
  • Youtube
  • Instagram
  • Twitter
  • Linkedin
  • Pinterest
  • Trang chủ

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!

Chào các bạn, chắc hẳn ai trong chúng ta đã biết về biến và tham chiếu khi học các môn cơ sở lập trình khi mới vào nghề. Thế nhưng khi làm việc với PHP một vài người tưởng như đã quên là nó có tồn tại, hoặc một vài người thì biết nó có nhưng lại không biết xài nó như nào; thậm chí một vài trong chúng ta đã từng xài nhưng lại phát sinh một số lỗi không ngờ tới.

Nội dung chính

  • Biến tham chiếu [reference variables]
  • Tham chiếu trong object và array
  • Tham chiếu trong function
  • Một số vấn đề khi dùng reference variable
  • Reference object
  • Reference array
  • Kết luận
  • Nguồn tham khảo

Nội dung chính

  • Biến tham chiếu [reference variables]
  • Tham chiếu trong object và array
  • Tham chiếu trong function
  • Một số vấn đề khi dùng reference variable
  • Reference object
  • Reference array
  • Kết luận
  • Nguồn tham khảo

Nội dung chính

  • Biến tham chiếu [reference variables]
  • Tham chiếu trong object và array
  • Tham chiếu trong function
  • Một số vấn đề khi dùng reference variable
  • Reference object
  • Reference array
  • Kết luận
  • Nguồn tham khảo

Để giúp các bạn hiểu rõ hơn về biến và tham chiếu trong PHP, đồng thời cũng giúp mình có cơ hội được tìm hiểu kỹ hơn về tính năng, đặc điểm này, hôm nay mình sẽ viết về vấn đề tham chiếu với biến trong PHP.

Để đảm bảo sự chính xác nguyên vẹn của thuật ngữ cũng như các định nghĩa, trong bài viết này mình xin phép dùng một số từ nguyên mẫu so với định nghĩa của nó:

  • Class: Lớp
  • Property , properties: Các thuộc tính trong class
  • Object: kiểu dữ liệu là các đối tượng [có thể là object hoặc class]
  • Array: kiểu dữ liệu là mảng
  • Reference: tham chiếu

Trong bài này, mình định nghĩa hai functions giúp mình in ra giá trị dễ nhìn hơn:

// Dùng để log trên màn hình console
function beatifyLog[...$arr]
{
    foreach [$arr as $item] {
        print_r[$item];
    }
}
// Dùng để log trên giao diện html
function beatifyHtml[...$arr]
{
    echo '
';
    foreach [$arr as $item] {
        print_r[$item];
    }
    echo '
'; }

Biến tham chiếu [reference variables]

Biến $b lúc này được gọi là biến tham chiếu của $a, còn gọi là [alias], khi $b$a trỏ về cùng một địa chỉ bộ nhớ trên máy. Lúc này, $a hoặc $b thay đổi giá trị thì biến còn lại cũng sẽ thay đổi theo.

$a;
$b = &$a;

Ví dụ:

Tham chiếu trong object và array

Trong PHP, các biến object là tham chiếu, trong khi mảng thì không. Ví dụ:

$arr = [
    'key'       => 'value',
    'other_key' => 'other_value',
];
$obj = [object] $arr;

$arr2 = $arr;
$obj2 = $obj;

$arr['key'] = 'another_value';
$obj2->key  = 'another_value';

beatifyLog['arr: ', $arr, 'arr2: ', $arr2];
echo "=====\n";
beatifyLog['obj: ', $obj, 'obj2: ', $obj2];

Kết quả là:

Như vậy muốn array tham chiếu được thì như thế nào? Minh xin chia sẻ một cách dùng trong foreach hữu ích giúp chúng ta có được điều đó:

$arr = [1, 2, 3, 4,];
beatifyLog['Initial Value: ', $arr];
echo "=====\n";
foreach [$arr as $item] {
    $item++;
}
beatifyLog['Foreach without reference: ', $arr];
echo "=====\n";
foreach [$arr as &$item] {
    $item++;
}
beatifyLog['Foreach with reference: ', $arr];

Và đây là kết quả sau khi chạy các dòng lệnh trên:

Tham chiếu trong function

PHP có hỗ trợ biến tham chiếu khi đưa vào function, cú pháp:

function fnName[&$a, $b]
{}

Ở đây $a là biến tham chiếu, còn $b là biến bình thường. Xét ví dụ cụ thể sau:

function test[&$a, $b]
{
    $a++;
    $b++;
}
$a = 3;
$b = 4;
beatifyLog['Before: ', 'a=', $a, '; b=', $b];
echo "\n";
test[$a, $b];
beatifyLog['After:  ', 'a=', $a, '; b=', $b];

Kết quả:

Một số vấn đề khi dùng reference variable

Đây là phần mình mong chờ nhất trong bài viết này. Dưới đây mình xin chia sẻ các lỗi mình đã gặp và cách xử lí khi làm việc với reference variable. Dĩ nhiên sẽ còn thiếu rất nhiều trường hợp, mong các bạn có thể chia sẻ thêm để giúp ích hơn cho bài viết của mình cũng như các bạn khác được hiểu rõ hơn.

Reference object

Để nói về vấn đề này, mình xin đưa ra một bài toán nho nhỏ để minh hoạ nhé.

  • Cho class Date cùng các method như bên dưới

    class Date
    {
        private $d = 0;
        private $m = 0;
        private $Y = 0;
    
        public function __construct[int $year, int $month, int $day]
        {
            $this->Y = $year;
            $this->m = $month;
            $this->d = $day;
        }
    
        private function addSubZero[int $i]: string
        {
            return $i > 9 ? $i : "0$i";
        }
    
        public function toString[]: string
        {
            $Y = $this->Y;
            $m = $this->addSubZero[$this->m];
            $d = $this->addSubZero[$this->d];
    
            return "$Y-$m-$d";
        }
    
        public function addYears[int $num]: Date
        {
            $this->Y += $num;
    
            return $this;
        }
    }
    
  • Cho một array các ngày tháng ngẫu nhiên, ví dụ

    $db = [
        '2021-01-02',
        '2020-01-02',
        '2021-01-01',
        '2020-01-05',
        '2019-01-05'
    ];
    
  • Nhập vào một ngày tháng năm [đúng định dạng], xuất ra các giá trị trong vòng 1 năm kể từ ngày nhập.

    Ví dụ input 2021-01-01. Kết quả mong muốn với array như trên là 2020-01-02, 2021-01-012020-01-05.

** Dưới đây là đoạn code của mình đề xuất:

// Should be 2021-01-01
$curYear  = new Date[2021, 1, 1];

// Should be 2020-01-01
$prevYear = $curYear;
$prevYear->addYears[-1];

// Should return 2020-01-02, 2021-01-01 and 2020-01-05
beatifyLog['Result:', array_filter[$db, function [$a] use [$curYear, $prevYear] {
    return $a >= $prevYear->toString[] && $a toString[];
}]];

Chạy thử đoạn code trên:

Xem kết quả, không như mong muốn, dể biết chi tiết, mình debug đoạn code trên:
// Should be 2021-01-01
$curYear  = new Date[2021, 1, 1];
beatifyLog['Initial CurYear: ' . $curYear->toString[]];
echo "\n";

// Should be 2020-01-01
$prevYear = $curYear;
$prevYear->addYears[-1];

// Should return 2020-01-02, 2021-01-01 and 2020-01-05
beatifyLog['Result: ', array_filter[$db, function [$a] use [$curYear, $prevYear] {
    return $a >= $prevYear->toString[] && $a toString[];
}]];

echo "\n";
beatifyLog['CurYear:', $curYear->toString[]];
echo "\n";
beatifyLog['PrevYear:', $prevYear->toString[]];

Kết quả:

Vậy lí do là gì ? Là vì object reference đó các bạn [mình đã nhắc ở trên rồi].

Thế thì có cách nào để sửa không nhỉ? Dĩ nhiên là có rồi, mình thử dùng clone của PHP nhé. Dưới đây là code mình có chỉnh sửa tí xíu:

$db = [
    '2021-01-02',
    '2020-01-02',
    '2021-01-01',
    '2020-01-05',
    '2019-01-05'
];

// Should be 2021-01-01
$curYear  = new Date[2021, 1, 1];
beatifyLog['Initial CurYear: ' . $curYear->toString[]];
echo "\n";

// Should be 2020-01-01
$prevYear = clone $curYear;
$prevYear->addYears[-1];

// Should return 2020-01-02, 2021-01-01 and 2020-01-05
beatifyLog['Result: ', array_filter[$db, function [$a] use [$curYear, $prevYear] {
    return $a >= $prevYear->toString[] && $a toString[];
}]];

echo "\n";
beatifyLog['CurYear:', $curYear->toString[]];
echo "\n";
beatifyLog['PrevYear:', $prevYear->toString[]];

Kết quả đây:

Kết quả đúng như mong muốn rồi!! Các bạn chú ý khi thao tác với object trong PHP nhé.

Reference array

Mình xin phép dùng lại một tí ví dụ ở phần reference trong array, đồng thời chỉnh sửa lại một tí:

$arr = [1, 2, 3, 4,];
beatifyLog['Initial Value: ', $arr];
echo "=====\n";
foreach [$arr as &$item] {
    $item++;
}
beatifyLog['Foreach with reference: ', $arr];
echo "=====\n";
echo "Foreach without reference and do nothing.\n";
foreach [$arr as $item] {
}
beatifyLog['And after that: ', $arr];

Và đây là kết quả:

Để giải thích vấn đề này thì có lẽ là nên đi sâu vào phần bộ nhớ của reference variable, nên mình xin phép hẹn lại lần sau nhé. Ở đây mình chỉ đề xuất phương pháp để "né" thôi ạ. Xin xem mình viết lại như sau:

$arr = [1, 2, 3, 4,];
beatifyLog['Initial Value: ', $arr];
echo "=====\n";
foreach [$arr as &$item] {
    $item++;
}
beatifyLog['Foreach with reference: ', $arr];
echo "=====\n";
echo "Foreach without reference and do nothing.\n";
foreach [$arr as $itemOther] {
}
beatifyLog['And after that: ', $arr];

Đơn giản là thay bằng tên biến khác thôi, và đây là kết quả:

Kết luận

Trên đây là những gì mình đã nghiên cứu, đồng thời cũng thu thập từ một số kinh nghiệm của mình về reference trong PHP, hi vọng phần nào hữu ích cho các bạn trong một số trường hợp.

Nguồn tham khảo

Bài viết này mình chủ yếu tham khảo trên trang document của PHP và phần còn lại là do những kinh nghiệm thực tế mình có được.

  • //www.php.net/manual/en/language.oop5.references.php
  • //www.php.net/manual/en/language.oop5.cloning.php

Chủ Đề