11
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi đã nhìn và cố gắng nhưng tôi không thể tìm thấy câu trả lời.
Trong PHP, liệu có thể gọi hàm thành viên của lớp (khi lớp đó yêu cầu một hàm tạo để nhận tham số) mà không cần khởi tạo nó như một đối tượng?
Một ví dụ mã (đưa ra lỗi):
<?php class Test { private $end=""; function __construct($value) { $this->end=$value; } public function alert($value) { echo $value." ".$this->end; } } //this works: $example=new Test("world"); $example->alert("hello"); //this does not work: echo Test("world")::alert("hello"); ?>hỏi ngày 23 tháng 6 năm 2010 lúc 4:06Jun 23, 2010 at 4:06
2
Thật không may, PHP không có hỗ trợ để làm điều này, nhưng bạn là một anh chàng sáng tạo và nhìn: D
Bạn có thể sử dụng một "nhà máy", mẫu:
<?php class Foo { private $__aaa = null; public function __construct($aaa) { $this->__aaa = $aaa; } public static function factory($aaa) { return new Foo($aaa); } public function doX() { return $this->__aaa * 2; } } Foo::factory(10)->doX(); // outputs 20Đã trả lời ngày 23 tháng 6 năm 2010 lúc 5:06Jun 23, 2010 at 5:06
2
Chỉ cần làm điều này (trong PHP> = 5.4):
$t = (new Test("Hello"))->foo("world");Đã trả lời ngày 19 tháng 3 năm 2014 lúc 3:34Mar 19, 2014 at 3:34
Andrew Uandrew uAndrew U
7297 Huy hiệu bạc10 Huy hiệu đồng7 silver badges10 bronze badges
0
Tôi cũng vậy, đang tìm kiếm một lớp lót để thực hiện điều này như là một phần của một biểu thức duy nhất để chuyển đổi ngày từ định dạng này sang định dạng khác. Tôi thích làm điều này trong một dòng mã duy nhất vì nó là một hoạt động logic duy nhất. Vì vậy, đây là một chút khó hiểu, nhưng nó cho phép bạn khởi tạo và sử dụng một đối tượng ngày trong một dòng duy nhất:
$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : '');Một cách khác để một dòng chuyển đổi chuỗi ngày từ định dạng này sang định dạng khác là sử dụng hàm trợ giúp để quản lý các phần OO của mã:
function convertDate($oldDateString,$newDateFormatString) { $d = new DateTime($oldDateString); return $d->format($newDateFormatString); } $myNewDate = convertDate($myOldDate,'F d, Y');Tôi nghĩ rằng cách tiếp cận định hướng đối tượng là tuyệt vời và cần thiết, nhưng đôi khi nó có thể tẻ nhạt, đòi hỏi quá nhiều bước để thực hiện các hoạt động đơn giản.
Đã trả lời ngày 1 tháng 9 năm 2011 lúc 15:40Sep 1, 2011 at 15:40
Bạn không thể gọi một phương thức cấp độ thể hiện mà không có một ví dụ. Cú pháp của bạn:
echo Test("world")::alert("hello");
Không có nhiều ý nghĩa. Hoặc là bạn đang tạo một thể hiện nội tuyến và loại bỏ nó ngay lập tức hoặc phương thức <?php class Foo { private $__aaa = null; public function __construct($aaa) { $this->__aaa = $aaa; } public static function factory($aaa) { return new Foo($aaa); } public function doX() { return $this->__aaa * 2; } } Foo::factory(10)->doX(); // outputs 20 1 không có phiên bản <?php class Foo { private $__aaa = null; public function __construct($aaa) { $this->__aaa = $aaa; } public static function factory($aaa) { return new Foo($aaa); } public function doX() { return $this->__aaa * 2; } } Foo::factory(10)->doX(); // outputs 20 2 ngầm.
Assuming:
class Test { public function __construct($message) { $this->message = $message; } public function foo($message) { echo "$this->message $message"; } }bạn có thể làm:
$t = new Test("Hello"); $t->foo("world");Nhưng cú pháp PHP không cho phép:
new Test("Hello")->foo("world");mà nếu không sẽ là tương đương. Có một vài ví dụ về điều này trong PHP (ví dụ: sử dụng lập chỉ mục mảng khi trả về hàm). Nó là như vậy.
Đã trả lời ngày 23 tháng 6 năm 2010 lúc 4:14Jun 23, 2010 at 4:14
cletuscletuscletus
Huy hiệu vàng 605K163163 gold badges903 silver badges940 bronze badges
1
Đối với điều này, bạn có thể làm một
//www.php.net/manual/en/reflectionclass.newinstancewithoutconstructor.php
Phản ánh lớp của bạn và kích hoạt thể hiện mới mà không có hàm tạo.
Đây là mã mẫu:
<?php class Test { private $end=""; function __construct($value) { $this->end=$value; } public function alert($value) { echo $value." ".$this->end; } public function end($value) { $this->end = $value; return $this; // return Test object so that you can chain to other function method. } } // Solution #1: // reflect your class. $reflector = new \ReflectionClass('Test'); // Then create a new instance without Constructor. // This will ignore the constructor BUT it will create a new instance of class Test. $say = $reflector->newInstanceWithoutConstructor(); // use end method that will return the Test object, then you can chain the alert() $say->end('World!')->alert("Hello"); // output: Hello World! ?>Đã trả lời ngày 1 tháng 11 năm 2021 lúc 10:20Nov 1, 2021 at 10:20
<?php class Foo { private $__aaa = null; public function __construct($aaa) { $this->__aaa = $aaa; } public static function factory($aaa) { return new Foo($aaa); } public function doX() { return $this->__aaa * 2; } } Foo::factory(10)->doX(); // outputs 20 0
Đã trả lời ngày 23 tháng 6 năm 2021 lúc 19:24Jun 23, 2021 at 19:24