国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table of Contents
Key Points
Brief description of interface
SPL and PHP interfaces
Countable Interface
ArrayAccess Interface
Conclusion
Home Backend Development PHP Tutorial Fun with Array Interfaces

Fun with Array Interfaces

Feb 22, 2025 am 10:46 AM

Fun with Array Interfaces

Key Points

  • PHP's array interface allows programmers to simulate the characteristics of native data types in custom classes, similar to Python's methods. This enables custom classes to work like arrays and allows common array operations such as counting elements, looping through elements, and accessing elements through indexes.
  • Interfaces are like contracts for classes, specifying methods that classes must contain. They allow encapsulation of implementation details and provide syntax sugar, thereby improving the readability and maintainability of the code. PHP provides a library of predefined interfaces that can implement these interfaces to make objects similar to arrays.
  • The
  • , Countable and ArrayAccess interfaces in IteratorPHP allow objects to pass count() methods, access like maps, and iterate over sets, respectively. These interfaces can be used to create more dynamic and interactive objects, such as Twitter timeline classes that can count their number of tweets, loop through them, and access tweets through their ID.

As a programmer who uses different programming languages ??every day, I really enjoy learning different things in other languages ??and trying to implement the same functionality in PHP. I especially like the feature in Python how to simulate native data types in custom classes.

For example, this member list class:

class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    // 其他方法
}

By implementing the __iter__ method, you can iterate over the data in such instances like iterating over a list (array in PHP):

class Members implements Iterator {
    private $members;
    private $position = 0;

    public function __construct(array $members) {
        $this->members = $members;
    }

    public function current() {
        return $this->members[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        $this->position++;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->members[$this->position]);
    }
}

$ls = new Members(["你", "我"]);

foreach ($ls as $member) {
    echo $member . "\n";
}

Membership test only needs to be implemented __contains__ Method:

class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    public function contains($member) {
        return in_array($member, $this->members);
    }
}

$members = new Members(["你", "我"]);

if ($members->contains("我")) {
    echo "我是一個成員!\n";
}

I think it would be great if I could do the following in PHP in an instance of a custom class (not just an array):

isset($myObject["test"]);

PHP allows us to achieve this using an array interface.

Brief description of interface

Treat an interface as a contract for the specified class to contain methods.

interface Multiplier {
    public function multiply($num1, $num2);
}

Any class using this interface must have this multiply method. There is a keyword that indicates that the class satisfies this contract: implements.

class SmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        return $num1 * $num2;
    }
}

As long as the contract is satisfied, the implementation method is irrelevant. Another way to implement the multiply method is as follows:

class NotSoSmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        $product = $num1;
        for ($i = 1; $i < $num2; $i++) {
            $product += $num1;
        }
        return $product;
    }
}

SPL and PHP interfaces

PHP provides a library of predefined interfaces that can make our objects similar to arrays by implementing these interfaces in a class.

Some of these interfaces are included in predefined interfaces and classes lists, and some are included in the standard PHP library (SPL).

If these terms sound intimidating, don't worry. You have used $_GET before. $_GET is a language structure called predefined .

On the other hand, according to the documentation, SPL is just

A collection of interfaces and classes designed to solve common problems.

What we need to do now is to see the actual application of these interfaces. Let's dig into it!

We will create a Twitter timeline class,

class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    // 其他方法
}

Can be able to calculate the number of tweets,

class Members implements Iterator {
    private $members;
    private $position = 0;

    public function __construct(array $members) {
        $this->members = $members;
    }

    public function current() {
        return $this->members[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        $this->position++;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->members[$this->position]);
    }
}

$ls = new Members(["你", "我"]);

foreach ($ls as $member) {
    echo $member . "\n";
}

Loop through them,

class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    public function contains($member) {
        return in_array($member, $this->members);
    }
}

$members = new Members(["你", "我"]);

if ($members->contains("我")) {
    echo "我是一個成員!\n";
}

and get the tweet via the tweet ID,

isset($myObject["test"]);

Just like we are in a normal array!

However, we must first solve some problems. If you don't have a Twitter account yet, create one first. Register a developer account now and generate an access token and key.

Next, download or clone the code from Github and run composer install in the source folder. If you are not familiar with Composer, see previous articles from SitePoint. Open the index.php file and add the necessary OAuth data.

Countable Interface

Countable The interface is probably the most self-explanatory. Just implement the count method and you can pass the object to the count() method.

We can get the number of tweets of users by performing a GET request on "/users/show".

interface Multiplier {
    public function multiply($num1, $num2);
}

ArrayAccess Interface

We will now increase the difficulty by learning a more interesting interface.

After implementation,

will enable our objects to be accessed like maps, which is exactly their essence. The method to achieve is ArrayAccess

class SmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        return $num1 * $num2;
    }
}
This is very convenient in our Twitter timeline objects. Testing whether a tweet exists in the timeline can be done by passing our object to

as shown below: isset

class NotSoSmartMultiplier implements Multiplier {
    public function multiply($num1, $num2) {
        $product = $num1;
        for ($i = 1; $i < $num2; $i++) {
            $product += $num1;
        }
        return $product;
    }
}
To do this, we just need to perform a GET request to the tweet ID.

$tweets = new Timeline("jeunito");
Better yet, we can also use the above for

and let offsetGet call offsetExists in turn. offsetGet

Using

, we can also delete it with the Tweet ID, but I will leave this for you to implement. offsetUnset

Unfortunately, achieving

doesn't make much sense. For something like this, the simple solution is to throw a custom exception, such as offsetSet. But on the other hand, it may also depend on the specific business rules of your application. UnsupportedOperationException

Interface Iterator

I saved my favorite interface for the last! The

interface is very useful here, because I don't think there is a better way to encapsulate the details of remote collection pagination than iterating over timeline objects like iterating over normal arrays. Iterator

First, the following method needs to be implemented:

count($tweets);
We can explicitly use the above method to loop through our timeline, as shown below:

foreach ($tweets as $tweet) {
    echo $tweet;
}
But why do this, when you can:

// 獲取
if (isset($tweets["some tweet id"])) {
    echo $tweets["some tweet id"];
}
In our example, we will loop through the tweets in the timeline by retrieving tweet blocks in chronological order and storing them in a buffer. We will iterate over this buffer until it runs out, and then we use the ID of the last tweet as the offset to get another batch of tweets.

Initially we didn’t have any tweets, and that’s where the rewind method comes in: Get the latest 10 tweets to start off the offset from where we can get the next 10 tweets.

class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    // 其他方法
}
The

valid() method is only used to indicate whether the loop continues. This can be done by checking if our tweet buffer is empty:

class Members implements Iterator {
    private $members;
    private $position = 0;

    public function __construct(array $members) {
        $this->members = $members;
    }

    public function current() {
        return $this->members[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        $this->position++;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->members[$this->position]);
    }
}

$ls = new Members(["你", "我"]);

foreach ($ls as $member) {
    echo $member . "\n";
}
The

key() and current() methods simply return the keys and values ??of the current tweet in our iteration. For our purposes, we will simply get the tweet ID and text of the latest tweet from the buffer.

class Members {
    public function __construct(array $members) {
        $this->members = $members;
    }

    public function contains($member) {
        return in_array($member, $this->members);
    }
}

$members = new Members(["你", "我"]);

if ($members->contains("我")) {
    echo "我是一個成員!\n";
}

Lastly next method. Here we dequeue from the head of the buffer to get the next element to iterate over. Then, if we are on the last element of the buffer, we will make sure to get the next set of tweets.

isset($myObject["test"]);

We're done! This is a very basic implementation of looping through user tweets. There are more things that can be done, such as local cache to save API calls, but that's the beauty of using interfaces: they allow us to change our policies in the background, and as long as our implementation is still correct, we can expect it to still work .

But now, you can observe how our timeline objects work by running php index.php on the command line.

Conclusion

The benefits of the interface are twofold. They allow us to encapsulate implementation details and provide us with syntactic sugar, both of which are very useful in any application that requires interoperability. If you have any questions or comments, please leave them in the comment section below!

The above is the detailed content of Fun with Array Interfaces. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are some best practices for versioning a PHP-based API? What are some best practices for versioning a PHP-based API? Jun 14, 2025 am 12:27 AM

ToversionaPHP-basedAPIeffectively,useURL-basedversioningforclarityandeaseofrouting,separateversionedcodetoavoidconflicts,deprecateoldversionswithclearcommunication,andconsidercustomheadersonlywhennecessary.StartbyplacingtheversionintheURL(e.g.,/api/v

How do I implement authentication and authorization in PHP? How do I implement authentication and authorization in PHP? Jun 20, 2025 am 01:03 AM

TosecurelyhandleauthenticationandauthorizationinPHP,followthesesteps:1.Alwayshashpasswordswithpassword_hash()andverifyusingpassword_verify(),usepreparedstatementstopreventSQLinjection,andstoreuserdatain$_SESSIONafterlogin.2.Implementrole-basedaccessc

What are the differences between procedural and object-oriented programming paradigms in PHP? What are the differences between procedural and object-oriented programming paradigms in PHP? Jun 14, 2025 am 12:25 AM

Proceduralandobject-orientedprogramming(OOP)inPHPdiffersignificantlyinstructure,reusability,anddatahandling.1.Proceduralprogrammingusesfunctionsorganizedsequentially,suitableforsmallscripts.2.OOPorganizescodeintoclassesandobjects,modelingreal-worlden

What are weak references (WeakMap) in PHP, and when might they be useful? What are weak references (WeakMap) in PHP, and when might they be useful? Jun 14, 2025 am 12:25 AM

PHPdoesnothaveabuilt-inWeakMapbutoffersWeakReferenceforsimilarfunctionality.1.WeakReferenceallowsholdingreferenceswithoutpreventinggarbagecollection.2.Itisusefulforcaching,eventlisteners,andmetadatawithoutaffectingobjectlifecycles.3.YoucansimulateaWe

How can you handle file uploads securely in PHP? How can you handle file uploads securely in PHP? Jun 19, 2025 am 01:05 AM

To safely handle file uploads in PHP, the core is to verify file types, rename files, and restrict permissions. 1. Use finfo_file() to check the real MIME type, and only specific types such as image/jpeg are allowed; 2. Use uniqid() to generate random file names and store them in non-Web root directory; 3. Limit file size through php.ini and HTML forms, and set directory permissions to 0755; 4. Use ClamAV to scan malware to enhance security. These steps effectively prevent security vulnerabilities and ensure that the file upload process is safe and reliable.

What are the differences between == (loose comparison) and === (strict comparison) in PHP? What are the differences between == (loose comparison) and === (strict comparison) in PHP? Jun 19, 2025 am 01:07 AM

In PHP, the main difference between == and == is the strictness of type checking. ==Type conversion will be performed before comparison, for example, 5=="5" returns true, and ===Request that the value and type are the same before true will be returned, for example, 5==="5" returns false. In usage scenarios, === is more secure and should be used first, and == is only used when type conversion is required.

How can you interact with NoSQL databases (e.g., MongoDB, Redis) from PHP? How can you interact with NoSQL databases (e.g., MongoDB, Redis) from PHP? Jun 19, 2025 am 01:07 AM

Yes, PHP can interact with NoSQL databases like MongoDB and Redis through specific extensions or libraries. First, use the MongoDBPHP driver (installed through PECL or Composer) to create client instances and operate databases and collections, supporting insertion, query, aggregation and other operations; second, use the Predis library or phpredis extension to connect to Redis, perform key-value settings and acquisitions, and recommend phpredis for high-performance scenarios, while Predis is convenient for rapid deployment; both are suitable for production environments and are well-documented.

How do I perform arithmetic operations in PHP ( , -, *, /, %)? How do I perform arithmetic operations in PHP ( , -, *, /, %)? Jun 19, 2025 pm 05:13 PM

The methods of using basic mathematical operations in PHP are as follows: 1. Addition signs support integers and floating-point numbers, and can also be used for variables. String numbers will be automatically converted but not recommended to dependencies; 2. Subtraction signs use - signs, variables are the same, and type conversion is also applicable; 3. Multiplication signs use * signs, which are suitable for numbers and similar strings; 4. Division uses / signs, which need to avoid dividing by zero, and note that the result may be floating-point numbers; 5. Taking the modulus signs can be used to judge odd and even numbers, and when processing negative numbers, the remainder signs are consistent with the dividend. The key to using these operators correctly is to ensure that the data types are clear and the boundary situation is handled well.

See all articles