In PHP, if we want to use a custom structure to define a common function without having to list all the structures, there is an efficient way to do it. This approach is achieved by using a variable number of parameters. We can accept any number of parameters by using ellipses (...) as parameter names in the function definition. Within the function body, we can use the func_get_args() function to get all the arguments passed to the function. This way, we can use these parameters inside the function without defining all the structures in advance. This flexible approach can help us write more general and reusable functions and improve coding efficiency.
Suppose I have two different structures:
type one struct { id string // other fields } type two struct { id string // other fields }
Is it possible to define a function that accepts both one
and two
without explicitly listing them as options?
For example I'm looking for something like this:
type ModelWithId struct { Id string } func Test[M ModelWithId](m M) { fmt.PrintLn(m.Id) } one := One { Id: "1" } Test(one) // Prints 1
I don't want to use functest[m one | two](m m)
because I might have 10+ structures and I don't want to have to go back to that function every time I add a new structure to the code base .
Generics use methods to constrain type parameter behavior, so you need to rewrite the code as:
type one struct { id string } func (o *one) id() string { return o.id }
Then your usage site will become:
type ModelWithId interface { Id() string } func Test[M ModelWithId](m M) { fmt.Println(m.Id()) }
The above is the detailed content of How can I define a generic function using a custom structure without listing all structures?. For more information, please follow other related articles on the PHP Chinese website!