What to Expect from PHP 8.5: Upcoming Features and Their Uses

PHP 8.5, scheduled for release on November 20, 2025, continues the evolution of the PHP language with a mix of new features, enhancements, and deprecations aimed at improving developer productivity, runtime performance, and language consistency.

Let’s take a quick look at the most anticipated features in PHP 8.5 and their practical applications.

🔧 1. Static Closures in Constant Expressions
What it is:
You’ll be able to embed static closures (anonymous functions) inside constant expressions, such as class constants or attribute arguments.

Use case:
This allows powerful, reusable logic in metadata, especially for frameworks and libraries relying on attributes or constant configurations.

const TRANSFORM = fn($x) => $x * 2;

📚 2. Improved Fatal Error Stack Traces
What it is:
When ini_set(‘fatal_error_backtrace’, 1) is enabled, full stack traces will now be available even for fatal errors.

Use case:
This is a major boost for debugging in production or CI environments, allowing faster root cause analysis of fatal issues like type errors or uncaught exceptions.

🧹 3. Deprecations and Cleanups
The Directory class constructor will be removed in favor of the dir() helper function.

MHASH constants (like MHASH_MD5, MHASH_SHA1) will be removed as part of crypto library cleanup.

Use case:
These removals encourage developers to use modern and secure APIs, like hash() or hash_hmac().

🧪 4. New Array Helpers: array_first() and array_last()
What it is:
These functions return the first or last element of an array, optionally based on a callback.

array_first($array, fn($item) => $item > 10);
array_last($array, fn($item) => $item < 5);

Use case:
Improves code readability when searching for specific elements at array boundaries—ideal for filtering, pagination, or traversal logic.

📦 5. Internationalization Helpers
What it is:
locale_is_right_to_left() and Locale::isRightToLeft() help determine text direction.

Use case:
Supports multilingual applications where layout direction (RTL vs. LTR) must dynamically adjust based on locale (e.g., Arabic, Hebrew).

🛠 6. New CLI Option: –ini=diff
What it is:
The php –ini=diff command shows the difference between loaded and default php.ini values.

Use case:
Great for debugging configuration mismatches, especially across environments or Docker containers.

Using MySQL multi query and creating a counter variable in PHP

cntI had this problem where I need to change the order of the products we have and  update them from the most popular to least popular. So what I did, I declared a variable that will act as a counter and set the column order_num to the current value of the counter. Here’s what I did:

$db = new mysqli("server", "user", "pass", "db_name");

$query = "set @cnt := 0;";

$query .= "update tbl set order_num = (@cnt := @cnt + 1);";

$db->multi_query($query);

You can also order specific record by adding an IN clause like:

$query .= "update tbl set order_num = (@cnt := @cnt + 1) where id IN (23, 76, 9, 45) order by field(id, 23, 76, 9, 45);";

Adding PHP Mobile Detect in CakePHP1.3 as a component

cake-logoIt seems that the library is not available for old version of CakePHP specifically in 1.3 only in 2.x. So what I did I converted the library as a component, there’s is nothing special about the conversion actually only if you are new to the Framework. Just download the file and unzip it, put it in your /app/controller/components directory.

Download >> Mobile Detect

How to use it:

In one of your controllers, append it in your $components variable like:

Class MyPageController extends AppController
{
  public $components = array('MobileDetect'); // adding the libraby in to your components

  public function beforeFilter() {
    parent::beforeFilter();
  }

  public function beforeRender() {
    // check the user's device and render the proper layout
    if($this->MobileDetect->isTablet()) {
      $this->layout = 'tablets';
    } elseif($this->MobileDetect->isMobile()) {
      $this->layout = 'mobiles';
    } else {
      $this->layout = 'default';
    }
  }
}

To download the original file go here.