ช่วยในการส่งผ่านข้อโต้แย้งไปยังฟังก์ชัน

function get_tags_by_criteria($gender="%", $min_age_of_birth="%", $max_age_of_birth="%", $country="%", $region="%", $city="%", $tag="") {

เมื่อฉันเพียงต้องการส่งอาร์กิวเมนต์แท็กและปล่อยให้อาร์กิวเมนต์อื่นเป็นค่าเริ่มต้น ฉันจะเขียนได้อย่างไร

ฉันลองสิ่งนี้แล้ว แต่มันใช้งานไม่ได้

    get_tags_by_criteria("", "", "", "", "", "", computer);

person never_had_a_name    schedule 09.12.2009    source แหล่งที่มา


คำตอบ (6)


คุณสามารถจำลองอาร์กิวเมนต์ที่มีชื่อได้โดยใช้อาเรย์ที่เชื่อมโยง:

function my_function($options)
 {
  extract($options);
 }

แล้วโทร

my_function(array("parameter1" => "value1", "parameter2" => "value2"));

เมื่อรวมกับการตรวจสอบที่มีประสิทธิภาพและตารางค่าเริ่มต้นภายในฟังก์ชันนั้นทำงานได้ดีมากสำหรับฉัน

ข้อเสีย: ไม่มีแบบแผน phpDoc ในการบันทึกอาร์กิวเมนต์ และ IDE ของคุณจะไม่สามารถแสดงอาร์กิวเมนต์ที่มีอยู่ให้กับคุณในขณะที่คุณพิมพ์ได้ คุณจะต้องป้อนพารามิเตอร์ที่มีอยู่ในบล็อก @desc ซึ่งอาจจะดูดีหรือไม่ก็ได้ ขึ้นอยู่กับ IDE ของคุณ

วิธีแก้ปัญหาอย่างหนึ่งคือการประกาศพารามิเตอร์ทั้งหมดในฟังก์ชัน แต่กำหนดให้ทั้งหมดยกเว้นพารามิเตอร์แรกหรือไม่ก็ได้ อันแรกอาจเป็นอาเรย์แบบเชื่อมโยงที่มีค่า

person Pekka    schedule 09.12.2009
comment
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ extract ได้ที่นี่: php.net/manual/en/function.extract php - person Steven; 07.10.2010

ใส่อาร์กิวเมนต์แท็กก่อน:

function get_tags_by_criteria($tag="", $gender="%", $min_age_of_birth="%", $max_age_of_birth="%", $country="%", $region="%", $city="%") 

และเรียกมันว่า:

get_tags_by_criteria(computer);
person Justin Ethier    schedule 09.12.2009

ไม่มีการส่งพารามิเตอร์ที่มีชื่อใน PHP โดยทั่วไป หากคุณมีพารามิเตอร์มากกว่า 4 ตัว และพารามิเตอร์จำนวนมากเป็นทางเลือก คุณอาจต้องการพิจารณาใช้อาร์เรย์หรือวัตถุแทน:

function get_tags_by_criteria($args) {
  ...
}

get_tags_by_criteria(array('gender' => 'M', 'tag' => 'php'));

คุณสามารถตั้งค่าพารามิเตอร์ที่อนุญาตได้อย่างชัดเจนโดยใช้ออบเจ็กต์แทน

person cletus    schedule 09.12.2009

น่าเสียดายที่คุณไม่สามารถทำเช่นนี้ได้ - อาร์กิวเมนต์เสริมที่ไม่ได้ระบุจะต้องอยู่ที่ส่วนท้ายของรายการอาร์กิวเมนต์ของฟังก์ชันเสมอ สิ่งที่คุณสามารถทำได้คือใช้ NULL สำหรับอาร์กิวเมนต์ที่คุณไม่ต้องการระบุ จากนั้นให้ตรวจสอบฟังก์ชันเพื่อดูว่าอาร์กิวเมนต์เป็น NULL หรือไม่ แล้วกำหนดเป็นค่าเริ่มต้นแทน

person Amber    schedule 09.12.2009
comment
คำตอบที่ดี เป็นโมฆะหรือค่าอื่นใดสำหรับเรื่องนั้น - person Alix Axel; 09.12.2009
comment
ค่าสุ่มใดๆ ก็สามารถใช้ได้ ใช่ แต่ฉันมักจะชอบ NULL เนื่องจากไม่น่าจะทับซ้อนกับค่าที่ไม่ใช่ค่าเริ่มต้นจริงใดๆ ที่คุณอาจต้องการส่งผ่าน :) - person Amber; 09.12.2009

มันเป็นไปไม่ได้ใน PHP

person Alix Axel    schedule 09.12.2009
comment
ฉันควรทำอย่างไรจึงจะมีผลเหมือนกันในการเลือกอาร์กิวเมนต์ที่จะส่งผ่านและอันไหนที่ฉันต้องการใช้ค่าเริ่มต้นด้วย ฉันไม่ต้องการสร้างฟังก์ชั่นที่แตกต่างกัน 7 ฟังก์ชั่นสำหรับสิ่งนั้น - person never_had_a_name; 09.12.2009
comment
ขออภัย การสร้างฟังก์ชันที่แตกต่างกัน 7 รายการเป็นทางเลือกเดียว แต่ OOP อาจช่วยคุณได้ - person Alix Axel; 09.12.2009

กรอบงาน CakePHP มักจะใช้อาร์เรย์ที่เชื่อมโยงเพื่อระบุชุดของตัวเลือก มันยังช่วยให้คุณระบุพารามิเตอร์แต่ละตัวหรืออาร์เรย์ที่เชื่อมโยงได้อีกด้วย ดูค้นหาวิธีการในคลาสโมเดลเป็นตัวอย่าง

นี่คือความพยายามของฉันในการทำให้ฟังก์ชันของคุณมีความยืดหยุ่นมากขึ้น:

<?php
function get_tags_by_criteria(
    $gender = '%', 
    $min_age_of_birth = '%', 
    $max_age_of_birth = '%', 
    $country = '%', 
    $region = '%', 
    $city = '%', 
    $tag = '') 
{
    if (is_array($gender))
    {
        $options = $gender;
        $gender = '%'; // reset to default
        extract($options);
    }

    $msg = "gender=$gender, min_age=$min_age_of_birth, " .
        "max_age=$max_age_of_birth, country=$country, region=$region, " .
        "city=$city, tag=$tag";
    return $msg;
}
?>
<p><?php echo get_tags_by_criteria('M'); ?></p>
<p><?php echo get_tags_by_criteria('M', 10); ?></p>
<p><?php echo get_tags_by_criteria(array(
    'country' => 'ca', 
    'tag' => 'sample')); ?></p>
person Don Kirkby    schedule 09.12.2009